2017-11-17 86 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'黑魔法的正式版本? –