我有一些这样的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])
我想将p1中的第一个数字与p2,p3和p4中的第一个数字进行比较等。
在这种情况下,我想找出每个元素是否在最低的两个元素中,以便输出
np.array([True,False,True])
np.array([True,False,True])
np.array([False,True,True])
np.array([False,True,False])
答案 0 :(得分: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个True值。 它为每列找到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]
选择第二行。这是每列中的第二低值。
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)执行,因此比较可以按元素进行。