2016-07-27 36 views
0

我有一些問題,理解python/numpy如何在比較空列表時進行數組形狀的轉換 - 就我所知,這是一個與False的隱式(元素明智)比較。numpy與空列表比較陣列的形狀

在下面的示例形狀由一個在最後一個維度減小,如果它不大於1

z = N.zeros((2,2,1)) 
z == [] 

>> array([], shape=(2, 2, 0), dtype=bool) 

z2 = N.zeros((2,2,2)) 
z2 ==[] 

>> False 

但是,如果我用假直接比較,我得到預期的輸出。

z = N.zeros((2,2,1)) 
(z == False).shape 

>> (2, 2, 2) 


z2 = N.zeros((2,2,2)) 
(z2 == False).shape 

>> (2, 2, 1) 

回答

2

這是在工作中的普通廣播。當你

z = N.zeros((2,2,1)) 
z == [] 

[]被解釋爲形狀(0,)的陣列,然後將形狀彼此廣播:

(2, 2, 1) 
vs (0,) 

由於(0,)(2, 2, 1)較短,它就會被擴大,因爲如果該陣列被重複複製:

(2, 2, 1) 
vs (2, 2, 0) 

並且由於在第一個形狀中存在1並且其他形狀不具有1那裏,第一形狀被「膨脹」,如同其被複制倍:因此

(2, 2, 0) 
vs (2, 2, 0) 

比較結果在布爾值的陣列具有形狀(2, 2, 0)


z具有形狀(2, 2, 2)

z2 = N.zeros((2,2,2)) 
z2 ==[] 

廣播失敗,因爲一個長度爲2的軸和一個長度-0軸不能相對於彼此進行廣播。 NumPy的報告說,它不知道如何進行比較:

>>> numpy.zeros([2, 2, 2]).__eq__([]) 
NotImplemented 

列表不知道怎麼要麼,所以Python倒在通過身份默認比較,並得到的False結果。


當你比較反對False

z = N.zeros((2,2,1)) 
(z == False).shape 

False被解釋爲形狀()陣列 - 一個空的形狀!這被廣播出來形成(2, 2, 1),彷彿被拷貝到一個完整的False s的陣列,所以結果與z的形狀相同。

+0

我總是將廣播理解爲將輸出數組擴展爲兩個輸入數組的最大形狀(如果適用)。在這種情況下,這是不正確的。謝謝澄清! – dbacc

+1

只有尺寸'1'尺寸被改變以匹配其他尺寸。尺寸'2'永遠不會擴大到匹配尺寸'4'。我會將廣播序列描述爲(2,2,1),(0,)=>(2,2,1),(1,1,0)=>(2,2,0)'。所有'1'都被改變了。 – hpaulj