直觀的方式讓作爲簡單的例子,其中我有數據陣列使用3D numpy的陣列
A = np.asarray([[1,3], [2,4]])
而這個數據是以下一個簡單的變換將被變換爲另一種形式:
Q = np.asarray([[-0.5,1], [1,0.5]])
B = np.dot(Q,np.dot(A,Q.T))
print B
現在假設我有一組數據,它採用2d數組的形式幾個時間步長。爲了簡單起見,再次假定這個數據只是A
被複制3個時間步驟。我們可以將此數據表示爲尺寸爲(2,2,N)
的3d陣列,其中N =3
在這種情況下。第三維然後代表數據的時間索引。現在很自然的要求有一種簡單的方式來轉換上面的數據,但是對於每個時間步,通過直觀的3D數組相乘,但是我只能做出以下非直觀的工作:
# Create the 3d data array
AA = np.tile(A,(3,1,1)) # shape (3,2,2)
BB = np.dot(Q,np.dot(AA,Q.T))
print np.all(BB[:,0,:] == B) # Returns true
所以用這個方法我沒有重鑄Q
陣列,使其工作,但是現在的第二個維度充當這是一個有點反直覺的,因爲在AA
這是第一個「時間」指數表示時間的維度...理想情況下,我想要一個解決方案,其中AA
和BB
在第三維中具有時間索引!
編輯:
由於dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
從文檔我想知道如果我想實現是不可能的?這似乎很奇怪,因爲這應該是一個相對普遍的事情,人們可能會希望...
隨着'numpy'的'第一軸是最外面的一個,所以'(N,2,2)'形狀可能更加自然,例如由np.array([A1,A2,A3])'產生,即3個2x2陣列的連接。但是這種'點'旋轉也可以與(2,N,2)或(2,2,N)一起使用。 'dot'通常適用於最後一次暗淡,第二次暗淡。 'np.matmul'和'np.einsum'是替代品。 – hpaulj
@hpaulj那麼如何在這種情況下執行數組乘法? – Jack