使用numpy查找数组中N个并发的索引

时间:2013-11-19 12:33:36

标签: python arrays numpy indexing

我有一个使用sp.distance.cdist获得的数组,这样的数组如下所示:

 [ 0.          5.37060126  2.68530063  4.65107712  2.68530063  4.65107712
   2.04846297  7.41906423  4.11190697  6.50622284  4.11190697  6.50622284]
 [ 5.37060126  0.          4.65107712  2.68530063  4.65107712  2.68530063
   7.41906423  2.04846297  6.50622284  4.11190697  6.50622284  4.11190697]
 [ 2.68530063  4.65107712  0.          2.68530063  4.65107712  5.37060126
   4.11190697  6.50622284  2.04846297  4.11190697  6.50622284  7.41906423]
 [ 4.65107712  2.68530063  2.68530063  0.          5.37060126  4.65107712
   6.50622284  4.11190697  4.11190697  2.04846297  7.41906423  6.50622284]
 [ 2.68530063  4.65107712  4.65107712  5.37060126  0.          2.68530063
   4.11190697  6.50622284  6.50622284  7.41906423  2.04846297  4.11190697]
 [ 4.65107712  2.68530063  5.37060126  4.65107712  2.68530063  0.
   6.50622284  4.11190697  7.41906423  6.50622284  4.11190697  2.04846297]
 [ 2.04846297  7.41906423  4.11190697  6.50622284  4.11190697  6.50622284
   0.          9.4675272   4.7337636   8.19911907  4.7337636   8.19911907]
 [ 7.41906423  2.04846297  6.50622284  4.11190697  6.50622284  4.11190697
   9.4675272   0.          8.19911907  4.7337636   8.19911907  4.7337636 ]
 [ 4.11190697  6.50622284  2.04846297  4.11190697  6.50622284  7.41906423
   4.7337636   8.19911907  0.          4.7337636   8.19911907  9.4675272 ]
 [ 6.50622284  4.11190697  4.11190697  2.04846297  7.41906423  6.50622284
   8.19911907  4.7337636   4.7337636   0.          9.4675272   8.19911907]
 [ 4.11190697  6.50622284  6.50622284  7.41906423  2.04846297  4.11190697
   4.7337636   8.19911907  8.19911907  9.4675272   0.          4.7337636 ]
 [ 6.50622284  4.11190697  7.41906423  6.50622284  4.11190697  2.04846297
   8.19911907  4.7337636   9.4675272   8.19911907  4.7337636   0.        ]]

我正在尝试使用numpy来搜索某些值,例如在2.72.3之间,同时我还想返回索引它们位于数组的行中。我已经阅读了很多内容,并且我找到了例如.argmin(),它可以部分地执行我想要的内容(但它只显示零或零的值位于零的位置,并且只是一个并发)。在.argmin的文档中,我找不到任何关于如何找到最小值与零的相关性以及在第一次并发后它不会停止的任何相关内容。我需要在间隔中为这些值执行此操作。为了更好地解释自己,这是我期望得到的:

e.g:

[row (0), index (2), index (4)]
[row (1), index (3), index (5)]
[row (2), index (0), index (3)]

最好的方法是什么?在此期间,我会继续尝试,如果我找到解决方案,我会在这里发布。

感谢。

2 个答案:

答案 0 :(得分:2)

你要找的是np.argwhere函数,它告诉你索引在数组中的条件满足的位置。

v = np.array([[ 0.     ,     5.37060126,  2.68530063 , 4.65107712 , 2.5 ],
              [ 5.37060126 ,  4.65107712 , 2.68530063 ,.11190697,1 ]])


np.argwhere((v > 2.3) & (v < 2.7))

array([[0, 2],
        [0, 4],
         [1, 2]])

答案 1 :(得分:1)

您需要的是numpy.where,它返回一个元组,其中包含每个维度的索引,其中True的值的某些条件为numpy.ndarray。使用您的数据的示例:

i, j = np.where(((a > 2.3) & (a < 2.7)))
#(array([ 0,  0,  2,  2,  4,  4,  6,  6,  8,  8, 10, 10], dtype=int64),
# array([2, 4, 3, 5, 0, 3, 1, 2, 0, 5, 1, 4], dtype=int64))

然后,您可以使用groupby以所需格式输出输出:

from itertools import groupby
for k,g in itertools.groupby(zip(i, j), lambda x: x[0]):
    print k, [tmp[1] for tmp in zip(*g)]
#0 [0, 4]
#2 [2, 5]
#4 [4, 3]
#6 [6, 2]
#8 [8, 5]
#10 [10, 4]