虽然我知道有各种问题正在寻找此错误消息的解决方案,但我还没有找到答案来帮助我解决我的代码以使比较工作,我有代码
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
,但三者都会产生相同的错误,请帮帮我
答案 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)
答案 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数组上的数学运算符本身会返回数组,因此我们可以在这些数组上调用all
或any
来查看所有或至少一个值是否为真实。您可以将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