2015-03-02 27 views
1

我想要做數組索引。我本來期望的結果是[0,1,1,0],但我只是得到一個錯誤。我該如何做這種類型的索引?列表中的python數組索引列表

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() 

向上頂,其實我的意思是說[假,真,真,假]不是[0,1,1,0]作爲我想要的布爾變量,所以我可以做索引

+0

確定。我檢查了文檔,這似乎是我正在尋找的。你能解釋爲什麼我的方法不起作用嗎?我很驚訝沒有一種數組索引像方法來做到這一點。 – user2015487 2015-03-02 16:27:29

+0

我已經移動我的評論回答一些更多的解釋。 – 2015-03-02 17:32:34

回答

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運營商將調用列表對象(['b', 'c']),然後的__contains__法列表中的每一個Python的對象將使用的方法PyObject_RichCompareBool每個項目比較a_np_arrayPyObject_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返回的對象是否已經是一個布爾類型,即TrueFalse(這是用做PyBool_CheckPy_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() 

鏈接到源代碼:

2

試試這個list comprehension

>>> print [int(x in ['b', 'c']) for x in a_np_array] 
[0, 1, 1, 0] 

利用的事實,int(True) == 1int(False) == 0