2015-11-19 49 views
1

我有一個4d陣列x,我想循環通過第一軸,修改該3D陣列,並將此修改後的陣列添加到新的4d陣列y「附加」多維numpy數組的正確方法?

我目前做這樣的事情:

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)) 

我猜有amuch清潔做到這一點。怎麼樣?

+0

Python級循環,*特別*附加在循環中,使用NumPy的方式非常慢。你可以讓'modify'在所有'x'上以矢量化方式運行嗎? – user2357112

+0

我很想去,但我不知道我是否可以。我的「修改」實際上是圖像的大小調整:'xmod = scipy.misc.imresize(x [i,:,:,0],1.3)'。我不認爲'imresize'可以被矢量化,但也許我錯了? – Fequish

+0

最好的辦法是創建一個合適的最終大小的空白數組,然後將結果逐一分配給它。 – user2357112

回答

2

如果你必須在x一個小矩陣在同一時間採取行動,你可以這樣做:

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

例如

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) 
+0

'對於x'中的子數組''和'np.empty_like'會更快。 – MaxNoe

+0

在我的第一個例子中,我必須使用'for i,在枚舉(x):'中,或者可以'zip(x,y)'。在這樣的情況下,我懷疑'empty_like'是否比'zeros_like'快得多。迭代需要更多時間。 – hpaulj