ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()python

时间:2015-03-27 20:45:32

标签: python numpy

我被要求使用带有np.meshgrid和np.angle()的网格(100,100)制作图像的图形,我唯一的问题是当我想制作最终的布尔网格时,python说:ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()。

from PIL import Image
import numpy as np

XX = np.arange(0,101)
YY = np.arange(0,101) 
x, y = np.meshgrid(XX, YY)

x = x-50
y = y-50

z = x+ y*-1j

print z    

a = np.angle(z,deg=True)

grid = (a>=0 and a<20) or (a>=40 and a<60) or (a>=80 and a<100) or (a>=120 and a<140) or++ (a<=-20 and a>-40) or (a<=-60 and a>-80) or (a<=-100 and a>-120) or (a<=-140 and a>-160)


grid = grid.astype('uint8') * 255
new_img = Image.fromarray(grid ,'L') 
new_img.save("grid .bmp")

2 个答案:

答案 0 :(得分:4)

有几个问题:

1)当给我们一条错误信息时,你应该指出它引用的代码行。

2)这是SO问题中最常见的错误消息之一(与Python和numpy相关)。

我的猜测是错误发生在:

grid = (a>=0 and a<20) or (a>=40 and a<60) or (a>=80 and a<100) or (a>=120 and a<140) or++ (a<=-20 and a>-40) or (a<=-60 and a>-80) or (a<=-100 and a>-120) or (a<=-140 and a>-160)

是由两件事造成的

1)使用and/or代替&/|

2)>=种运算符相对于&amp; / |的优先级。把()放在前者周围。


In [168]: a=np.arange(10)

In [169]: (a>=0 and a<20) or (a>=40 and a<60) or (a>=80 and a<100)
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [171]: ((a>=0) & (a<20)) | ((a>=40) & (a<60)) | ((a>=80) & (a<100))
Out[171]: array([ True,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

所以正确的表达是

((a>=0) & (a<20)) | ((a>=40) & (a<60)) | ((a>=80) & (a<100)) ...

答案 1 :(得分:1)

分别针对&|尝试*+andor

&#34;和&#34;和&#34;或&#34;比较整个对象的整体真实性,但是你想要元素和...的类比。还有numpy函数logical_andlogical_or更明确。