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)
原因是and
Python使用关键字来测试两个布尔值.数组如何成为布尔值?如果75%的物品是True
,True
或是False
?因此,numpy拒绝比较两者.
因此,您必须使用逻辑函数在逐个元素的基础上比较两个布尔数组(np.logical_and
)或二元运算符&
.
此外,出于索引目的,您确实需要一个与您要编制索引的数组大小相同的布尔数组.而且它必须是一个数组,你不能用列表True/False
来代替:其原因是,使用一个布尔数组告诉NumPy的要返回的元素.如果使用列表True/False
,NumPy会将其解释1/0
为整数列表,即索引,这意味着您要么获得数组的第二个元素或第一个元素.不是你想要的.
现在,你可以猜到,如果你想使用两个布尔数组a
或b
索引,选择其中任何一个a
或b
为True的项目,你会使用
c[np.logical_or(a,b)]
Run Code Online (Sandbox Code Playgroud)
要么
c[a | b]
Run Code Online (Sandbox Code Playgroud)
试图用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)
您的问题的部分解决方案可能替换and
为np.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)
归档时间: |
|
查看次数: |
72700 次 |
最近记录: |