比较两个矩阵值

时间:2018-03-19 18:18:10

标签: python

我有一个条件,需要比较值。 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

1 个答案:

答案 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()

这正是你的错误。