2017-07-29 91 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)執行,以便該比較可以做逐元素。