尝试索引数组时,具有多个元素的数组的真值是不明显的

Rtr*_*der 16 python numpy list-comprehension

如果var(另一个numpy数组)中的元素> = 0且<=.1,我试图将rbs的所有元素放入一个新数组中.但是,当我尝试以下代码时,我收到此错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)
rbs = [ish[4] for ish in realbooks]
for book in realbooks:
    var -= float(str(book[0]).replace(":", ""))
    bidsred = rbs[(var <= .1) and (var >=0)]
Run Code Online (Sandbox Code Playgroud)

关于我做错的任何想法?

Pie*_* GM 31

正如我在对先前回答的评论中告诉你的那样,你需要使用:

c[a & b]
Run Code Online (Sandbox Code Playgroud)

要么

c[np.logical_and(a, b)] 
Run Code Online (Sandbox Code Playgroud)

原因是andPython使用关键字来测试两个布尔值.数组如何成为布尔值?如果75%的物品是True,True或是False?因此,numpy拒绝比较两者.

因此,您必须使用逻辑函数在逐个元素的基础上比较两个布尔数组(np.logical_and)或二元运算符&.

此外,出于索引目的,您确实需要一个与您要编制索引的数组大小相同的布尔数组.而且它必须是一个数组,你不能用列表True/False来代替:其原因是,使用一个布尔数组告诉NumPy的要返回的元素.如果使用列表True/False,NumPy会将其解释1/0为整数列表,即索引,这意味着您要么获得数组的第二个元素或第一个元素.不是你想要的.

现在,你可以猜到,如果你想使用两个布尔数组ab索引,选择其中任何一个ab为True的项目,你会使用

c[np.logical_or(a,b)]
Run Code Online (Sandbox Code Playgroud)

要么

c[a | b]
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 9

试图用Python的布尔运算符(当您通常收到此错误信息not,and,or在涉及numpy的阵列,如比较表达式)

>>> x = np.arange(-5, 5)
>>> (x > -2) and (x < 2)
Traceback (most recent call last):
  File "<ipython-input-6-475a0a26e11c>", line 1, in <module>
    (x > -2) and (x < 2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)

那是因为这种比较,与Python中的其他比较相反,创建了布尔数组而不是单个布尔值(但也许你已经知道了):

>>> x > -2
array([False, False, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)
>>> x < 2
array([ True,  True,  True,  True,  True,  True,  True, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

您的问题的部分解决方案可能替换andnp.logical_and,它通过两个数组广播AND操作np.bool.

>>> np.logical_and(x > -2, x < 2)
array([False, False, False, False,  True,  True,  True, False, False, False], dtype=bool)
>>> x[np.logical_and(x > -2, x < 2)]
array([-1,  0,  1])
Run Code Online (Sandbox Code Playgroud)

但是,这样的布尔数组不能用于索引普通的Python列表,因此需要将其转换为数组:

rbs = np.array([ish[4] for ish in realbooks])
Run Code Online (Sandbox Code Playgroud)