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

时间:2015-06-29 22:52:37

标签: python arrays numpy error-code

虽然我知道有各种问题正在寻找此错误消息的解决方案,但我还没有找到答案来帮助我解决我的代码以使比较工作,我有代码

def f(x,d,h,L):
    ans=0.
    if ((0.<=x) & (x<d)):
        ans=h*(x/d)
    elif ((d<=x) & (x<=L)):
        ans=((L-x)/(L-d))
    return ans

x=np.linspace(0,10,1000)
h=5*10**(-3)
d=16*10**(-2)
L=64.52*10**(-2)
func=f(x,d,h,L)

但是当我尝试运行它时,我收到一个错误,指向标题中包含错误代码的if行,我尝试了类似问题中提出的建议解决方案,例如使用{{1} }或np.logical_and代替and,但三者都会产生相同的错误,请帮帮我

6 个答案:

答案 0 :(得分:5)

使用numpy.where。 (可选)对浮点数使用指数表示法。

for line in f: 
    if line.count("/") == 2 and line.count(":") == 2: 
        current_time = datetime.strptime(line.strip(), '%m/%d/%y %H:%M:%S') 
    while line.count("/") != 2 and line.count(":") != 2: 
        print(line) 
        continue 

答案 1 :(得分:4)

你专注于条款的结合,但它是条款本身。你可能想要这样的东西:

if numpy.all(0 <= x) and numpy.all(x < d):
    ...

请参阅numpy.all的文档。

答案 2 :(得分:1)

我能够通过将x定义为一个数组来解决我的问题,创建一个单独评估每个x的循环,不确定它是否是最有效的方法,但我只是使用1000次迭代以便它运行良好,这就是我所做的:

def f(a,d,h,L):
ans2=[]
for i in range(1000):
    if (0.<=a[i]) & (a[i]<d):
        ans=x[i]*(h/d)
        ans2.append(ans)
    elif ((d<=a[i]) & (a[i]<=L)):
        ans=h*((L-a[i])/(L-d))
        ans2.append(ans)
return ans2
L=64.52*10**(-2)
x=np.linspace(0,L,1000)
h=5*10**(-3)
d=16*10**(-2)
plot.plot(x,f(x,d,h,L))

希望它能解决其他人的问题,如果能够更快地进行优化,我很乐意学习如何。

答案 3 :(得分:0)

错误与数组包含多个值的事实有关。例如a < 0其中a = 1具有明确的真值(false)。但是,如果a是数组,该怎么办?例如[-1, 0, 1],一些元素小于零,一些元素大于或等于零。那么真相应该是什么呢?为了能够创建真值,您必须指定是否希望 all 值小于零,或者至少一个值小于零(任何价值)。

由于numpy数组上的数学运算符本身会返回数组,因此我们可以在这些数组上调用allany来查看所有或至少一个值是否为真实。您可以将if语句重写为:

if (0 <= x).all() and (x < d).all():
    ...
# alternatively
if 0 <= x.min() and x.max() < d:
    ...

答案 4 :(得分:0)

其他人已经回答假设您要应用一个计算或其他计算,具体取决于x的所有/任何值是否满足相应条件。我将做出不同的假设 - 您希望将f分别应用于x的每个元素。

按元素应用元素我得到:

In [226]: x=np.linspace(0,1,20)

In [227]: [f(z,d,h,L) for z in x]
Out[227]: 
[0.0,
 0.0016447368421052631,
 0.0032894736842105261,
 0.0049342105263157892,
 0.89586497157981526,
 0.78739098364212268,
 0.6789169957044302,
 0.57044300776673762,
 0.46196901982904509,
 0.35349503189135251,
 0.24502104395365998,
 0.13654705601596731,
 0.028073068078274897,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0]

矢量化等价物:

In [238]: I = (0<=x) & (x<d)
In [239]: J=(d<=x) & (x<=L)

In [240]: out=np.zeros_like(x)
In [241]: out[I]=h*(x[I]/d)
In [242]: out[J]=(L-x[J])/(L-d)

In [243]: out
Out[243]: 
array([ 0.        ,  0.00164474,  0.00328947,  0.00493421,  0.89586497,
        0.78739098,  0.678917  ,  0.57044301,  0.46196902,  0.35349503,
        0.24502104,  0.13654706,  0.02807307,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ])

我允许你把它打包成一个函数。

根据给定的参数(包括完整的x),np.all(I)np.all(J)都是False,意味着f会返回0.0如果作为一个整体应用于x

def f(x, d, h, L):
   I = (0<=x) & (x<d)
   J=(d<=x) & (x<=L)
   out=np.zeros_like(x)
   out[I]=h*(x[I]/d)
   out[J]=(L-x[J])/(L-d)
   return out

答案 5 :(得分:0)

def f(x,d,h,L):
    ans=0.
    if ((0.<=x) & (x<d)):
        ans=h*(x/d)
    elif ((d<=x) & (x<=L)):
        ans=((L-x)/(L-d))
    return ans

#A ajouter
f_vec = numpy.vectorize(f)
#et c'est tout^^

x=np.linspace(0,10,1000)
h=5*10**(-3)
d=16*10**(-2)
L=64.52*10**(-2)
func=f_vec(x,d,h,L) #ici il faut tout de même ajouter _vec