首先,你不能索引使用[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
运营商将调用列表对象(['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
检查对象是否可以被认为是truthy对象,这是通过调用该对象的__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()
链接到源代码:
确定。我检查了文档,这似乎是我正在寻找的。你能解释为什么我的方法不起作用吗?我很惊讶没有一种数组索引像方法来做到这一点。 – user2015487 2015-03-02 16:27:29
我已经移动我的评论回答一些更多的解释。 – 2015-03-02 17:32:34