2013-08-03 28 views
3

隨着以下對象數組:NumPy,爲什麼相等性檢查不適用於一組對象?

a = np.array([[1], [1, 2], [1, 2, 3], [1], [1]], dtype=object) 
b = np.array([(1,), (1, 2), (1, 2, 3), (1,), (1,)], dtype=object) 

下平等檢查不起作用:

a==[1] 
#array([False, False, False, False, False], dtype=bool) 

b==(1,) 
#array([False, False, False, False, False], dtype=bool) 

如果我使用字符串代替:

c = np.array(['[1]', '[1, 2]', '[1, 2, 3]', '[1]', '[1]']) 

平等的檢查工作:

c == '[1]' 
#array([ True, False, False, True, True], dtype=bool) 

爲什麼數組檢查的行爲如此?

如果我們遍歷a或b和執行檢查這也給了預期的結果:

[i==[1] for i in a] 
#[True, False, False, True, True] 

[i==(1,) for i in b] 
#[True, False, False, True, True] 

謝謝!

回答

5

NumPy被設計爲在許多情況下將數組類對象自動視爲數組。在這裏,NumPy認爲[1](1,)是類似數組的對象,並應用了broadcasting規則。任一側的長度爲1的軸向外擴展至另一個對象相應軸的長度,並且如果一個對象的維度小於另一個對象,則在左側填充缺少的維度,並在這些維度中填充其他對象的長度。因此,

a == [1] 

給出相同的結果

a == numpy.array([1, 1, 1, 1, 1]) 

其是5 False秒的陣列。

+1

謝謝!你知道一種避免廣播規則的方法,使a與元素方面的'[1]'相比較嗎? –

+0

沒有。我的建議是避免使用序列(或數組)作爲數組元素。你可以嘗試將它們包裝在某種絕對不是列表對象中,或者查看[masked arrays](http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html)是否適合你用例。 – user2357112

+0

你可以創建一個空的''()'數組,然後用你的'[1]'列表填充它。 'c = np.empty([],dtype = object); c [()] = [1]'。這樣可以避免自動嘗試將列表解釋爲自己的數組。將'a'與'c'進行比較會給你你後面的結果。 –

相關問題