2014-04-06 49 views
0

給定一個numpy中的平坦的NxN數組,我希望找到最小值以及它在數組中的偏移量。我已經設法找到最小值,但可以確定偏移量(哪一行和哪一列)?確定numpy中的值的偏移量

在下面的例子中,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

來自[1,0]和[2,1]的0.5都是最小值。你在尋找第一個位置還是最後一個位置? – utdemir

+0

是否可以使用此值列出所有偏移量? – twfx

+0

你不能用內置'min'函數,但你可以很容易地編寫一個循環來完成它。添加到我的答案。 – utdemir

回答

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已經返回一個數組。

+0

我編寫了所有的方法來解決這個問題,但最終在這裏知道它只需要Python的幾行代碼就可以做到這一點!感謝旁白,尤其是。從numpy進口*的副作用,我不知道。 – twfx

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)] 
+0

只需返回第一個偏移就足夠了。但我想知道是否可以列出具有相同最小值的所有偏移量? – twfx

+0

編輯答案。 – utdemir