鑑於3個numpy的數組:一個多維數組x
,一個矢量y
尾隨單尺寸,和一個矢量z
沒有拖尾單尺寸,numpy的廣播切片陣列和矢量
x = np.zeros((M,N))
y = np.zeros((M,1))
z = np.zeros((M,))
的廣播操作的行爲變化取決於在向量表示和上下文:
x[:,0] = y # error cannot broadcast from shape (M,1) into shape (M)
x[:,0] = z # OK
x[:,0] += y # error non-broadcastable output with shape (M) doesn't match
# broadcast shape(M,M)
x[:,0] += z # OK
x - y # OK
x - z # error cannot broadcast from shape (M,N) into shape (M)
我知道我可以做到以下幾點:
x - z[:,None] # OK
但我不明白這個明確的表示法會給我什麼。它當然不會購買可讀性。我不明白爲什麼表達x - y
是好的,但x - z
是不明確的。
爲什麼Numpy會處理帶有或不帶尾隨單獨尺寸的矢量?
編輯:documentation指出:兩個維度是兼容當它們相等時,或它們中的一個是1,但y
和z
均爲功能M x 1
矢量,由於M x 0
向量不包含任何元素。
的一個關鍵點是,'X [:0]'是一維。 'x [:,[0]]'是(M,1)。 'z [:] = y'可能會給出相同的錯誤。 – hpaulj
'z'可以在不進行復制的情況下重新整形爲(M,1)或(1,M)。但從功能上來說,它更接近(1,M),因爲開始時的自動擴展。 – hpaulj