我有一個 2D 陣列xshape(48, 7)和一個 4D 陣列Tshape (48, 7, 48, 7)。當我相乘x * T時,python 會廣播尺寸,但不是以我預期的方式(實際上,我不明白它是如何廣播的)。以下回圈將實作我想要的:
for i in range(48):
for j in range(7):
Tx[i, j, :, :] = x[i, j] * T[i, j, :, :]
Tx形狀陣列在哪里(48, 7, 48, 7)。我的問題是,有沒有辦法使用廣播達到相同的結果?
uj5u.com熱心網友回復:
廣播對齊尾隨尺寸。換句話說,x * Tx正在這樣做:
for i in range(48):
for j in range(7):
Tx[:, :, i, j] = x[i, j] * T[:, :, i, j]
要使主要尺寸對齊,請將單位尺寸添加到x:
Tx = x[..., None, None] * T
或者,您可以使用np.einsum明確指定尺寸:
Tx = np.einsum('ij,ij...->ij...', x, T)
uj5u.com熱心網友回復:
我找到了解決方案,
Python 從最右邊的維度廣播,并且向左作業(https://numpy.org/doc/stable/user/basics.broadcasting.html#:~:text=When operating on% 20two arrays, NumPy compares their shapes element-wise. It starts with the trailing (即 rightmost) dimensions and works its way left。)。
通過轉置前兩個維度和后兩個維度:
T = np.transpose(T, (2,3,0,1))
然后它會按照我預期的方式廣播,之后可以再次轉置生成的陣列以恢復原始形狀。
Tx = x*T
Tx = np.transpose(Tx, (2,3,0,1))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414904.html
標籤:
上一篇:函式中大小為4的無效讀/寫
