鉴于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))
答案 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)]