排名多个numpy数组

时间:2017-07-29 02:40:54

标签: python arrays 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])

我想将p1中的第一个数字与p2,p3和p4中的第一个数字进行比较等。

在这种情况下,我想找出每个元素是否在最低的两个元素中,以便输出

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

1 个答案:

答案 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)执行,因此比较可以按元素进行。