首先,您不能在此处使用[0,1,1,0] 进行索引,因此您使用了错误的术语。
>>> a_np_array[[0,1,1,0]] # Not useful at all
array(['a', 'b', 'b', 'a'],
dtype='|S1')
如果我理解正确,您只是想检查['b', 'c'] 中是否存在a_np_array 的项目,为此使用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 操作符将调用列表对象(['b', 'c']) 的__contains__ 方法,然后对于列表中的每个对象,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和Py_True完成的),如果是则返回结果否则立即调用PyObject_IsTrue 来检查对象是否可以被认为是真实对象,这是通过调用对象的__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()
源代码链接: