pandas 将布尔数组结果迭代传递到if语句时出现问题-python的新功能

yacmzcpb  于 2022-12-09  发布在  Python
关注(0)|答案(1)|浏览(82)

我尝试使用数组和if语句的组合。我检查两个不同的一维数组中的两个元素是否返回True。(我已经做到了这一点)然后我尝试将True / False传递到if语句中--但针对数组中的每个结果(不是全部,也不是任何一个)。我不知道如何构建我尝试创建的if语句。
下面的代码就是我要传递给if语句的代码,当单独打印时,它会像我相信的那样工作,返回一个布尔数组。
l0,l1,l2,l3是数字数组,我分别检查了它们的输出

test = np.array(np.greater_equal(l0,l1))
print(test)

[[False]
 [False]
 [False]
 [False]
 [False]
 [False]
 [False]
 [False]
 [False]
 [False]
 [False]
 [ True]
 [ True]
 [ True]
 [ True]
 [ True]
  . . . . continues

当我尝试在一个普通的If语句中使用数组的输出时,我遇到了一个错误,它引用了歧义。我并不想在数组中的“所有”或“任何”元素彼此〉=时返回true,我想一次检查一个元素,并在这两种情况下按照下面的方式赋值变量。

test = np.array(np.greater_equal(l0,l1))
if test:
    cu1 = l0 - l1
    cd1 = 0
else:
    cd1 = l1 - l0
    cu1 = 0

Error: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()我可以将索引位置传递到if语句中,并使用生成的变量赋值执行进一步的计算,对此有什么想法吗?
如果有帮助的话,我正在使用的内容的完整上下文

if np.array(np.greater_equal(l0,l1)):
    cu1 = l0 - l1
    cd1 = 0
else:
    cd1 = l1 - l0
    cu1 = 0

if np.array(np.greater_equal(l1,l2)):
    cu2 = cu1 + l1 - l2
    cd2 = cd1
else:
    cd2 = cd1 + l2 - l1
    cu2 = cu1

if np.array(np.greater_equal(l2,l3)):
    cu = cu2 + l2 - l3
    cd = cd2
else:
    cu = cu2
    cd = cd2 + l3 - l2

if np.array(np.not_equal(np.sum(cu + cd),0)): 
    x = cu / (cu + cd) 
else: 
    x = 0

x = np.array(x)
dtcbnfnu

dtcbnfnu1#

大家好,欢迎来到Python社区。
不幸的是,python内置的if只能同时检查一个TrueFalse,因此不可能以您的方式使用if构造,除非您决定分别迭代每个元素。
幸运的是,您的问题经常出现,numpy为这个问题提供了一个函数:np.where
下面是一个如何使用它的示例:

import numpy as np

# Your arrays here; note that it might be convenient to
# convert your input lists to arrays, which allows you
# to simply use the ">=" operator instead of the more 
# verbose np.greater_equal.
l0 = np.array([3, 1, 4, 3, 5, 2])
l1 = np.array([1, 6, 4, 8, 5, 0])

cu1 = np.where(l0 >= l1, l0 - l1, 0)
cd1 = np.where(l0 >= l1, 0, l1 - l0)

这相当于你的第一个例子(虽然有错误)。我添加了两个np.where语句,因为你有两个数组,你想在每个if中计算。在你的语言中,一个out = np.where(conditions, value_if_true, value_if_false)应该是这样的:

if conditions:
    out = value_if_true
else:
    out = value_if_false

最后,(如果这是不请自来的建议,请道歉),我发现numpy在很多时候都比我早一步。例如,在第一个示例中,您可以使用下限0来限制l0 - l1,而不是根据l0是否大于l1来选择l0 - l1和0。看一下np.clip,或者在您的情况下,np.maximum就可以做到这一点:

cu1 = np.maximum(l0 - l1, 0)
cd1 = np.maximum(l1 - l0, 0)

相关问题