我有一个条件,需要比较值。 AV
是一个文件,53
是一个数字。即使我创建array = 53 * len(AV)
,python也有问题。
The truth value of an array with more than one element is ambigous.
如果有条件,我该怎么做才能解决这个问题?
def app_visc(PV, YP, Dbit, DP, ROP):
vcut = 1/((1-(Dbit/DP)**2)*(0.64 + np.divide(18.16, ROP)))
vslipguess = 3 #Guess
vcrit = vcut + vslipguess
AV = PV + np.divide(5*YP*(Dbit-DP),vcrit)
if AV <= 53: #TODO: porównanie wartości macierzy
vslip = 0.0051*AV + 3.006
else:
vslip = 0.02554*(AV-53) + 3.28
return vslip
答案 0 :(得分:2)
if AV <= 53:
可能意味着(至少)三种不同的东西,它们都有非常不同的效果。因此,numpy的目的不是为了猜测你的意思,而是提出这个错误来迫使你明确。
如果您希望在所有值低于53时执行某些操作,则使用all
函数或方法:
if np.all(a<=53): # or (a<=53).all()
如果您想在任何值低于53时执行某些操作,请使用any
函数或方法:
if np.any(a<=53): # or (a<=53).any()
如果你想为53下的每个值做一些,并且你想用纯Python循环来做这件事,你只需循环遍历bool数组:
for i, flag in enumerate(a<=53):
if flag:
但是当然你几乎总是想要在numpy中进行循环:
a[a<=53]
这只是一个数组,a
的所有值都是<= 53
。
如果您想确切了解这是如何发生的,您可以将事情分解为几个步骤。虽然if a<=53:
循环非常简单,但numpy中的任何内容都不像它看起来那么简单。试试这个:
>>> a = np.array([0, 50, 100, 50, 0])
>>> a<=53
array([True, True, False, True, True])
所以a<=53
实际上是一个包含5个bool的数组 - 每个人都会告诉你a
的相应成员是<=53
。
如果您尝试使用它,就好像它是一个bool
:
>>> bool(a<=53)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这正是你的错误。