你可以使用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)执行,以便该比较可以做逐元素。