比较两个矩阵值

2024-06-17 15:07:15 发布

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

我有一个条件,需要比较值。AV是一个arary,53是一个数字。即使我创建了array = 53 * len(AV),python也有一个问题。你知道吗

The truth value of an array with more than one element is ambigous.

我该怎么解决这个if条件?你知道吗

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

Tags: ifnp条件arraydppvdividerop
1条回答
网友
1楼 · 发布于 2024-06-17 15:07:15

有(至少)三种不同的东西你可以用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个布尔组成的数组,每个布尔告诉你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()

那正是你的错误。你知道吗

相关问题 更多 >