首先,你不能索引使用[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