2015-03-31 96 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))