Python - ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

时间:2017-02-27 22:10:04

标签: python arrays numpy

我有一个数据文件,我使用ascii.read来读入python列表。我使用np.asarray转换它们,所以我可以使用列表的值进行计算。一些计算以分母中的负ln或0结束,显然,这是破坏的。我试图做一个if else声明,如果它少于< 0然后乘以-1。如果没有,请正常进行数学运算。 (我还不知道我是否只想乘以-1或做其他事情)。

我收到此错误: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我想要一个列表/数组作为我的输出,所以a.any或a.all对我没有帮助,因为我担心个别值,而不是列表是否包含它。

for item in radius:
subtraction = np.array(npi0/(npp - npb))
if subtraction < 0:
    tau = np.array(B*(np.log(subtraction*(-1))))
else:
    tau = np.array(B*(np.log(subtraction)))

如果这个特定问题重复,我很抱歉,我找不到与我的问题有关的内容。我刚刚在最近几周开始编程。

2 个答案:

答案 0 :(得分:1)

要用绝对值替换零以下的所有值,只需使用布尔掩码并乘以-1(或做任何你想做的事情):

subtraction[subtraction < 0] *= -1
tau = np.array(B*(np.log(subtraction)))

您还可以使用np.wherenp.abs之类的函数:

subtraction = np.where(subtraction < 0, np.abs(subtraction), subtraction)

创建一个新数组,其中包含原始数组为< 0的绝对值或减法不满足条件>= 0的原始值。

正如@Robert Kern在评论中指出的那样,在这种情况下,不需要任何分支:

tau = B * np.log(np.abs(subtraction))

答案 1 :(得分:0)

经常会出现此值错误 - 请参阅所有侧栏问题。基本上,它是尝试在if语句中使用布尔数组的结果:

In [218]: sub = np.arange(-5,5)    
In [219]: sub
Out[219]: array([-5, -4, -3, -2, -1,  0,  1,  2,  3,  4])
In [220]: sub<0
Out[220]: array([ True,  True,  True,  True,  True, False, False, False, False, False], dtype=bool)

In [221]: if sub<0: print('ouch')
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

它应该使用哪种对错?像这样的if没有任何内置或隐含的循环。

@MSeifert提出了很好的解决方案,但您应该了解问题的根源。

处理你想对数组的某些部分做不同事情的一个很好的通用方法是布尔掩码:

In [222]: mask = sub<0    

In [223]: np.log(-sub[mask])
Out[223]: array([ 1.60943791,  1.38629436,  1.09861229,  0.69314718,  0.        ])

In [224]: np.log(sub[~mask])
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log
  #!/usr/bin/python3
Out[224]: array([       -inf,  0.        ,  0.69314718,  1.09861229,  1.38629436])

(我可以改进掩蔽来处理sub==0案例)。