2016-12-05 3 views
0

У меня есть 4D массив: array = np.random.rand(3432,1,30,512)NumPy вставки 2D массив в структуре 4D

У меня также есть 5 наборов 2D массивов с формой (30,512)

хочу, чтобы вставить их в структуру 4D вдоль оси 1, так что моя окончательная форма: (3432,6,30,512) (5 новых массивов + оригинал 1). Мне нужно итеративно вставить этот набор для каждого из элементов 3432.

Каков наиболее эффективный способ сделать это?

Я пробовал преобразовать 2D в 4D, а затем вставить вдоль оси 1. Я ожидаю, что ось 1 никогда не будет превышать размер 6, но 2D-массивы просто продолжают добавляться, а не набор для каждого из 3432 элемента. Я думаю, что моя проблема заключается в не вполне понимая obj параметров для insert метода:

all_data = np.reshape(all_data, (-1, 1, 30, 512)) 

for i in range(all_data.shape[0]): 
    num_band = 1 
    for band in range(5):    
     temp_trial = np.zeros((30, 512)) # Just an example. values arent actually 0 
     temp_trial = np.reshape(temp_trial, (1,1,30,512)) 
     all_data = np.insert(all_data, num_band, temp_trial, 1) 

     num_band += 1 
+0

'insert' не предназначен для итеративной работы. Прежде всего убедитесь, что вы понимаете примеры документов. – hpaulj

ответ

1

Создать массив с окончательной формой первым и вставить элементы позже:

final = np.zeros((3432,6,30,512)) 

for i in range(3432): # note, this will take a while 
    for j in range(6): 
     final[i, j, :, :] = # insert your array here (np.ones((30, 512))) 

или, если вы действительно хотите чтобы транслировать это по оси нулевого, предполагая, что каждый из 3432 должен быть одинаковым для каждой «полосы»:

for i in range(6): 
    final[:, i, :, :] = # insert your array here (np.ones((30, 512))) 

пока вам не нужно много циклов, нет необходимости его векторизовать

+1

'insert' должен делать этот вид выделения и копировать в любом случае, поэтому установка полного размера' final' в начале имеет большой смысл. – hpaulj

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