我想知道是否有一種更“numpythonic”或更有效的方法來執行以下操作:假設我有一個A已知長度的一維數組L,并且有一個多維數組B,它的維度也有長度L。假設我想添加(或設置) 的值B[:, ..., x, ..., :] += A[x]。換句話說,將該值添加到匹配索引 中A[x]的整個子數組的每個值。Bx一個非常簡單的工作示例是這樣的:A = np.arange(10, 20)B = np.random.rand(3, len(A), 3)for iii in range(len(A)): B[:, iii, :] += A[iii]顯然,我總是可以像上面那樣循環遍歷我想要的索引,但我很好奇是否有更有效的方法。如果有一些更常見的術語來描述這個過程,我也會感興趣,因為我什至很難構建適當的谷歌搜索。我還試圖避免創建與 -vector 形狀相同的新數組,B并在其他索引上重復平鋪A-vector ,然后將其添加到B,因為更“真實”的世界應用程序可能涉及B相對較大的數組。
1 回答

HUH函數
TA貢獻1836條經驗 獲得超4個贊
對于您的簡單情況,您可以這樣做:
B[:]?=?A[:,?None]
這是因為廣播才有效。B
通過模擬in的尺寸A
,您可以明確告訴 numpy 將元素放置在哪里。對于更一般的情況,您想要沿著的A
維度放置,您可以執行以下操作:k
B
B[:]?=?np.expand_dims(A,?tuple(range(A.ndim,?A.ndim?+?B.ndim?-?k)))
np.expand_dims
將在您告訴它的索引處添加軸。還有其他方法。例如,您可以A
使用B.ndim - k - 1
以下實例建立索引None
:
B[:]?=?A[(slice(None),?*(None,)?*?(B.ndim?-?k?-?1))]
您還可以使用np.reshape
來獲取正確形狀的視圖:
B[:]?=?A.reshape(-1,?*np.ones(B.ndim?-?k?-?1,?dtype=int))
或者
B[:]?=?A.reshape(-1,?*(1,)?*?(B.ndim?-?k?-?1))
或者
B[:]?=?A.reshape((-1,)?+?(1,)?*?(B.ndim?-?k?-?1))
在所有這些情況下,您只需要擴展 的尾隨維度A
,因為這就是廣播的工作原理。由于廣播是 numpy 不可或缺的一部分,因此您只需替換即可=
獲得+=
預期結果。
添加回答
舉報
0/150
提交
取消