2016-07-12 13 views
2

我想了解numpy的廣播如何影響np.allclose的輸出。爲什麼numpy的廣播有時會允許比較不同長度的數組?

>>> np.allclose([], [1.]) 
True 

我不明白爲什麼這樣的作品,但這並不:

>>> np.allclose([], [1., 2.]) 
ValueError: operands could not be broadcast together with shapes (0,) (2,) 

什麼是這裏的規則是什麼? numpy docs關於空數組,我找不到任何東西。

+0

'兩個維度是當它們相等時兼容,或它們中的一個是1' - 這當然是真的,所以根據定義,兩者應該是廣播兼容的。然而,我沒有看到這對維數0和1有直觀的意義。 – cel

+0

@cel:請參閱下面的答案 – Julien

+0

@cel考慮'np.allclose([],1)'。它們的維數是'(0,)'和'()',所以既不等於也不等於1。這是唯一的兼容性規則? –

回答

1

廣播規則適用於另外還有,

In [7]: np.array([])+np.array([1.]) 
Out[7]: array([], dtype=float64) 

In [8]: np.array([])+np.array([1.,2.]) 
.... 

ValueError: operands could not be broadcast together with shapes (0,) (2,) 

讓我們看一下形狀。

In [9]: np.array([]).shape,np.array([1.]).shape,np.array([1,2]).shape 
Out[9]: ((0,), (1,), (2,)) 

(0,)和(1) - 的(1,)可以被調節以匹配其他陣列的形狀。 A 1可以調整維度以匹配其他數組,例如從1增加到3。但是在這裏它顯然是從1調整爲0.我通常不使用具有0維度的數組,但是這看起來像更高維度的適當概括。

嘗試(0,)和(1,1)。其結果是(1,0):

In [10]: np.array([])+np.array([[1.]]) 
Out[10]: array([], shape=(1, 0), dtype=float64) 

(0,),(1,1)=>(1,0),(1,1)=>(1,0)

對於形狀爲(0,)和(2,)的第二種情況;沒有任何尺寸1的尺寸可以調整,因此是錯誤的。

形狀(0,)和(2,1)並廣播(以(2,0)):

In [12]: np.array([])+np.array([[1.,2]]).T 
Out[12]: array([], shape=(2, 0), dtype=float64) 
1

廣播不影響np.allclose以任何其他方式影響任何其他功能。

正如在@cel評論中,[1.]是維度1,因此可以廣播到任何其他維度,包括0.另一方面,[1., 2.]是維度2,因此無法廣播。

現在爲什麼allclose([],[1.]) == True?這實際上是有道理的:這意味着[]中的所有元素都接近1.。相反意味着[]中至少有一個元素不接近1.,明顯是False,因爲在[]中根本沒有元素。

另一種方式去思考它要問自己,你將如何實際代碼allclose()

def allclose(array, target=1.): 
    for x in array: 
     if not isclose(x, target): 
      return False 
    return True 

這將在與[]叫回True

+1

我原則上同意,但是如何解釋'np.allclose([1。],[])'也是' TRUE'? [1.]中的所有元素都等於..哼...什麼都沒有?另一種方式感覺非常不直觀。 – cel

+0

@cel:因爲你不應該這樣讀:'[1.]'不會以其他方式廣播到'[]'。 (就像將[[1.]'播放到[[1,2,3]]一樣,而不是相反的方式,這也是無稽之談。) – Julien

相關問題