2017-04-06 90 views
1

我想切片數組,以便我可以使用它來執行任意維度的另一個數組的操作。換句話說,我做了以下內容:根據需要附加np.newaxis

A = np.random.rand(5) 
B = np.random.rand(5,2,3,4) 
slicer = [slice(None)] + [None]*(len(B.shape)-1) 
result = B*A[slicer] 

有一些語法,我可以使用,這樣我就不需要建立slicer

+0

重塑可能是一個選項:'B * A.reshape(A.shape +(1)*(B.ndim-1))',但基本上是一樣的。 – Divakar

+0

你的代碼讓我想起expand_dims在內部做了什麼,除了只增加了1個軸。廣播默認是向另一個方向擴展。用你自己的功能來包裝這個動作可能是最簡單的。 – hpaulj

回答

3

在這種特定情況下,您可以使用帶有省略號的np.einsum

result2 = np.einsum('i,i...->i...', A, B) 

np.allclose(result, result2) 

Out[232]: True 

雖然,作爲@hpaulj指出(如果你使用1/B或部門)這僅適用於乘法。

由於廣播通常從另一端開始工作,因此可以使用np.transpose兩次以正確的順序獲取座標軸。

result3 = np.transpose(np.transpose(B) * A) 

但是,這也不是一個一般的情況下

+0

不錯,但它僅限於乘法。 – hpaulj