2015-11-19 2 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

'для subarray в x' и' np.empty_like' будет быстрее. – MaxNoe

+0

В моем первом примере мне пришлось бы использовать 'for i, row in enumerate (x):', или может 'zip (x, y)'. В такой ситуации я сомневаюсь, что 'empty_like' намного быстрее, чем' zeros_like'. Итерация занимает гораздо больше времени. – hpaulj

Смежные вопросы