你可以使用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)執行,以便該比較可以做逐元素。