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

2024-04-19 11:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

虽然我知道有很多问题需要解决这个错误消息,但是我还没有找到一个帮助我解决代码以使比较正常工作的答案,我有代码

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行,我尝试了在类似问题中给出的建议解决方案,比如使用np.logical_andand,而不是&,但是这三个都会产生相同的错误,请帮助我解决


Tags: and答案代码消息标题returnifdef
3条回答

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

import numpy as np

def f(x, d, h, L):
    return np.where(x < d, h*(x/d), (L - x)/(L - d))

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

func = f(x, d, h, L)

你关注的是从句的连词,但这是从句本身。你可能想要这样的东西:

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

请参阅^{}的文档。

我可以通过将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))

希望它也能解决别人的问题,如果它能优化得更快,我很想学习如何。

相关问题 更多 >