我想做数组索引。我原以为结果是[0,1,1,0],但我只是得到一个错误。我该怎么做这种索引?
a_np_array=np.array(['a','b','c','d'])
print a_np_array in ['b', 'c']
Traceback (most recent call last):
File "dfutmgmt_alpha_osis.py", line 130, in <module>
print a_np_array in ['b', 'c']
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
在顶部,我实际上是想说[False,True,True,False]而不是[0,1,1,0]因为我想要bool所以我可以做索引
答案 0 :(得分:2)
试试这个list comprehension:
>>> print [int(x in ['b', 'c']) for x in a_np_array]
[0, 1, 1, 0]
利用int(True) == 1
和int(False) == 0
答案 1 :(得分:1)
首先,您无法在此处使用[0,1,1,0]
进行索引,因此您使用了错误的字词。
>>> a_np_array[[0,1,1,0]] # Not useful at all
array(['a', 'b', 'b', 'a'],
dtype='|S1')
如果我理解正确,你只是试图检查a_np_array
中是否存在['b', 'c']
的项目,对于该用途numpy.in1d
,但是当它返回布尔数组时我们只是需要将其转换为整数数组。
>>> np.in1d(a_np_array, ['b','c'])
array([False, True, True, False], dtype=bool)
>>> np.in1d(a_np_array, ['b','c']).astype(int)
array([0, 1, 1, 0])
为什么a_np_array in ['b', 'c']
无效?
此处in
运算符将调用列表对象的__contains__
方法(['b', 'c']
),然后对于列表中的每个对象,Python将使用方法PyObject_RichCompareBool
进行比较每个项目到a_np_array
。 PyObject_RichCompareBool
首先只检查要比较的项目是否是相同的对象,即相同的id()
,如果是,则立即返回1,否则请致电PyObject_RichCompare
他们。因此,这将有效:
>>> a_np_array in [a_np_array, 'c', 'a']
True
但是这不是:
>>> a_np_array in [a_np_array.copy(), 'c', 'a']
Traceback (most recent call last):
File "<ipython-input-405-dfe2729bd10b>", line 1, in <module>
a_np_array in [a_np_array.copy(), 'c', 'a']
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
现在Python将检查PyObject_RichCompare
返回的对象是否已经是布尔类型,即True
或False
(这是使用PyBool_Check
和{{3}完成的}),如果是,则立即返回结果,否则调用Py_True
来检查对象是否可以被视为真正的对象,这是通过调用对象的__nonzero__
方法来完成的。对于NumPy数组,这将最终在返回的对象上调用bool()
,这将引发您正在获得的错误。 NumPy希望您拨打all()
或any()
来检查所有项目是True
还是至少一项。
>>> bool(a_np_array == 'a')
Traceback (most recent call last):
File "<ipython-input-403-b7ced85c4f02>", line 1, in <module>
bool(a_np_array == 'a')
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
源代码链接: