2015-03-31 48 views
1

只是好奇心,我似乎無法弄清楚,它一定是簡單的東西!任何想法都會非常有幫助!numpy.where()函數僅用於精確匹配?

兩個數組,y中只有一個值匹配x中的任何值。我的代碼將迭代x中的每個值,並在y中找到匹配值並計算每個值的距離。它需要去找到一個匹配的值的最小距離輸入在z [i,j]

它的工作,直到我把1更改爲1.1,我嘗試允許它尋找值的一些變化。如果y中的「1」可以在0.9-1.0之間變化,我怎麼解釋它?

x = [[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]] 
y = [[2,2,2,2,2],[2,2,2,2,2],[2,2,1,2,2],[2,2,2,2,2],[2,2,2,2,2]] 

xx = numpy.array(x) 
yy = numpy.array(y) 

zz = numpy.ones((5,5)) 

for i in range(0,5): 
    for j in range(0,5): 
     match = numpy.where((xx[i,j] == yy)) 

     distance = sqrt((i-(np.array(match[0])))**2 + (j -(np.array(match[1])))**2) 
     zz[i,j] = min(distance) 

我試圖的變化:

match = numpy.where((yy-0.1 <= xx[i,j] <= yy+0.1)) 

「錯誤:ValueError異常:陣列的具有多於一個元素的真值是不明確的使用a.any()或a.all(。 )」

+1

順便說一下......在第二個** 2的前面有一個缺失的''' – plonser 2015-03-31 17:07:33

+0

哎呀!感謝指出:) – Ciaran 2015-03-31 17:16:08

+1

我認爲它是在'** 2'的前面...不落後...除非你想要負數的平方根;) – plonser 2015-03-31 17:17:42

回答

2

當它只是避免錯誤,請嘗試

numpy.where((yy-0.1 <= xx[i,j]) & (xx[i,j] <= yy+0.1)) 
+0

完美!感謝那。 由於「和」只是一個邏輯比較函數,爲什麼它在這種情況下不起作用? – Ciaran 2015-03-31 17:19:45

+1

我認爲''和'只適用於帶有單個元素的列表,而'&'適用於兩個數組的元素明智 – plonser 2015-03-31 17:24:25

+2

'和'是一個Python運算符,可與2個布爾標量一起使用。它'並不知道'numpy'陣列。 – hpaulj 2015-03-31 17:26:54

0

關於錯誤,它更詳細地解釋s here(其他地方)。

或者,您可以簡單地使用np.isclose。喜歡:

numpy.where(numpy.isclose(xx[i,j],yy, atol=0.1))