确定numpy中值的偏移量

时间:2014-04-06 12:33:36

标签: python python-2.7 numpy

鉴于NumpN中的NxN阵列变平,我想找到最小值及其在数组中的偏移量。我设法找到了最小值,但是可以识别偏移量(哪一行和哪一列)?

在下面的例子中,a = 0.5,如何从[1,0]或[2,1]知道它是否为0.5?

from numpy import *

value = 0
NUM_NODE = 5
EDGE = array(zeros((NUM_NODE, NUM_NODE)))
EDGE = [[ 0.,          0.,          0.,          0.,          0.        ],
    [ 0.5,         0.,          0.,          0.,          0.        ],
    [ 1.,          0.5,         0.,          0.,          0.        ],
    [ 1.41421356,  1.11803399,  1.,          0.,          0.        ],
    [ 1.,          1.11803399,  1.41421356,  1.,          0.        ]]

a = reshape(EDGE, NUM_NODE*NUM_NODE)
print min(filter(lambda x : x > value, a))

2 个答案:

答案 0 :(得分:3)

您可以使用np.where

>>> edge = np.array(EDGE) 
>>> edge[edge > 0].min()
0.5
>>> np.where(edge == edge[edge > 0].min())
(array([1, 2]), array([0, 1]))

给出x坐标和y坐标,它们分别达到最小值。如果你想把它们组合起来,有很多方法,例如

>>> np.array(np.where(edge == edge[edge > 0].min())).T
array([[1, 0],
       [2, 1]])

一些旁白:from numpy import *是一个坏习惯,因为它取代了一些内置函数和numpy的版本,它们的工作方式不同,在某些情况下会产生相反的结果; ALLCAPS变量名通常只给定常量;和你的

 EDGE = array(zeros((NUM_NODE, NUM_NODE)))

行没有做任何事情,因为您的EDGE = [[ 0., ... etc行会立即生成新的list并将EDGE绑定到它。你制作了一个阵列并扔掉了。此处也无需拨打array; zeros已经返回一个数组。

答案 1 :(得分:2)

numpy.ndenumerate将枚举数组(顺便说一句,你不应该通过重新整形来丢失位置信息)。

In [43]: a = array(EDGE)

In [44]: a
Out[44]: 
array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.5       ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 1.        ,  0.5       ,  0.        ,  0.        ,  0.        ],
       [ 1.41421356,  1.11803399,  1.        ,  0.        ,  0.        ],
       [ 1.        ,  1.11803399,  1.41421356,  1.        ,  0.        ]])

In [45]: min((i for i in ndenumerate(a) if i[1] > 0), key=lambda i: i[1])
Out[45]: ((1, 0), 0.5)

如果你想要每次出现,你都可以用旧的方式做到:

In [11]: m, ms = float("inf"), []

In [12]: for pos, i in ndenumerate(a):
   ....:     if not i: continue
   ....:     if i < m: 
   ....:         m, ms = i, [pos]
   ....:     elif i == m:
   ....:         ms.append(pos)
   ....:         

In [13]: ms
Out[13]: [(1, 0), (2, 1)]