适当的方式来"追加"多维numpy数组?

时间:2015-11-19 22:42:48

标签: python numpy

我有一个4d数组x,我要为其循环第一个轴,修改该3d数组,并将此修改后的数组添加到新的4d数组y

我目前正在做类似的事情:

xmod = modify(x[0, :, :, :])
y = xmod.reshape(1, x.shape[1], x.shape[2], x.shape[3])
for i in range(1, x.shape[0]):
    xmod = modify(x[i, :, :, :])
    y = np.vstack((y, xmod))

我猜这样做有更清洁。怎么样?

1 个答案:

答案 0 :(得分:2)

如果您必须一次对x个子矩阵采取行动:

y = np.zeros_like(x)
for i in range(x.shape[0]):
    y[i,...] = modify(x[i,...])

e.g。

In [595]: x=np.arange(24).reshape(4,3,2)
In [596]: y=np.zeros_like(x)
In [597]: for i in range(x.shape[0]):
   .....:     y[i,...]=x[i,...]*2
   .....:     
In [598]: y
Out[598]: 
array([[[ 0,  2],
        [ 4,  6],
        ...
        [40, 42],
        [44, 46]]])

附加到列表通常比重复“附加”到数组更好:

In [599]: y=[]
In [600]: for row in x:
   .....:     y.append(row*2)
   .....: 
In [601]: y=np.array(y)

对于非常大的情况,您可以看到vstack(或连接轴= 0)是否更快。但是你必须明确地向数组添加一个起始维度。

In [615]: y=[]
In [616]: for row in x:
    y.append((row*2)[None,:])
   .....:     
In [617]: np.vstack(y)