2017-07-29 60 views
1

我有一些numpy的阵列,这样排名多个numpy的阵列

p1 = np.array([140,142,145]) 
p2 = np.array([130,144,147]) 
p3 = np.array([150,141,147]) 
p4 = np.array([150,141,148]) 

我想第一个数字与P2,P3和P4的第一个数字比较P1等

在这种情况下我想找到,如果每一个元素都是最低的两个之间,使输出

np.array([True,False,True]) 
np.array([True,False,True]) 
np.array([False,True,True]) 
np.array([False,True,False]) 

回答

3

你可以使用np.argpartition寻找最小2个每列的值:

import numpy as np 
p1 = np.array([140,142,145]) 
p2 = np.array([130,144,147]) 
p3 = np.array([150,141,147]) 
p4 = np.array([150,141,148]) 
P = np.row_stack([p1,p2,p3,p4]) 

result = np.argpartition(P, 2, axis=0) < 2 
print(result) 

产生

[[ True False True] 
[ True False True] 
[False True False] 
[False True False]] 

np.argpartition(arr, k)部分各种arr升序排列。 每组k元素小于下一组k元素, ,但在每个组内可能不会对元素进行排序。


请注意,上面的代码每列总是只有2个真值。 它找到每个列的最低值的2个,但可能找不到所有这样的值。 如果你想找到所有这样的值,可以使用在列的排序顺序

In [302]: P <= P[np.argpartition(P, 2, axis=0), np.arange(P.shape[1])][1] 
Out[302]: 
array([[ True, False, True], 
     [ True, False, True], 
     [False, True, True], 
     [False, True, False]], dtype=bool) 

P[np.argpartition(P, 2, axis=0), np.arange(P.shape[1])]回报P

In [5]: P[np.argpartition(P, 2, axis=0), np.arange(P.shape[1])] 
Out[5]: 
array([[130, 141, 145], 
     [140, 141, 147], 
     [150, 142, 147], 
     [150, 144, 148]]) 

P[np.argpartition(P, 2, axis=0), np.arange(P.shape[1])][1]选择第2行。这些是每列中第二低的值。

In [6]: P[np.argpartition(P, 2, axis=0), np.arange(P.shape[1])][1] 
Out[6]: array([140, 141, 147]) 

比较P <= np.array([140, 141, 147])broadcasting从形状(3)的右手侧上的阵列到形状(4,3)执行,以便该比较可以做逐元素。