2017-11-17 89 views
1

我有一個3x3 numpy數組,我想創建一個3x3xC矩陣,其中新維度由原始3x3數組的精確副本組成。我確信這是問某處,但我找不到最好的方法。我計算出如何爲一個簡單的一個維數組x做到這一點:Numpy:新維矩陣的堆棧副本

new_x = np.tile(np.array(x, (C, 1)) 

其中重複陣列,然後執行:

np.transpose(np.expand_dims(new_x, axis=2),(2,1,0)) 

,擴大了尺寸並切換軸,使得該陣列是在第三維重複(雖然這工作,我不知道這是否是最好的方式來做到這一點) - 一個nxn numpy數組的最有效的方法是什麼?

+0

不知道我是否理解,但你可以用'np.tile(x,(C,1))做同樣的事情。 –

+0

這只是轉置一個二維矩陣,我想要在第三維中重複該數組。 – ru111

+0

我最喜歡的解決方案就是像'new_x = np.empty((3,3,2),dtype = x.dtype); new_x [...] = x [...,None]' –

回答

5

對於只讀版本,broadcast_to可以使用:

In [370]: x = np.arange(9).reshape(3,3) 
In [371]: x 
Out[371]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
In [372]: x = np.broadcast_to(x[..., None],(3,3,10)) 
In [373]: x 
Out[373]: 
array([[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]], 

     [[3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 
     [4, 4, 4, 4, 4, 4, 4, 4, 4, 4], 
     [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]], 

     [[6, 6, 6, 6, 6, 6, 6, 6, 6, 6], 
     [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], 
     [8, 8, 8, 8, 8, 8, 8, 8, 8, 8]]]) 

或用repeat

In [378]: x=np.repeat(x[...,None],10,2) 
In [379]: x 
Out[379]: 
array([[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]], 

     [[3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 
     [4, 4, 4, 4, 4, 4, 4, 4, 4, 4], 
     [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]], 

     [[6, 6, 6, 6, 6, 6, 6, 6, 6, 6], 
     [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], 
     [8, 8, 8, 8, 8, 8, 8, 8, 8, 8]]]) 

這是一個較大的陣列,其元素可以單獨改變。

+0

不錯。 '(3,3,10)'是在這裏硬編碼的嗎? –

+0

你可以從'x.shape'和'C'構造元組。 – hpaulj

+1

不錯的一個。所以'broadcast_to'會是所有'stride_tricks'黑魔法的正式版本? –