Skip to main content
 首页 » 编程设计

python之ValueError : The truth value of an array with more than one element is ambiguous. 使用 a.any() 或 a.all() python

2025年05月04日93pengyingh

我被要求使用带有 np.meshgrid 和 np.angle() 的网格 (100,100) 制作下面的图像,我唯一的问题是当我想制作最终的 bool 网格时,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") 

请您参考如下方法:

几个问题:

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) 使用和/或代替&/|

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


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)) ...