我有一个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))
我猜这样做有更清洁。怎么样?
答案 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)