Объединить массив NumPy внутри цикла for - PullRequest
0 голосов
/ 17 октября 2018

Я создаю внутри цикла for в каждой итерации его массив с размером 20x30x30x3.Я хочу объединить все эти массивы в больший.Если шаги итерации равны 100, то массив я должен иметь значение 2000x30x30x3.Я пытался сделать со списками:

new_one_arr1_list = []
new_one_arr2_list = []
all_arr1 = np.array([])
for item in one_arr1: # 100 iterations
    item = np.reshape(item, (1, 30, 30, 3))
    new_one_arr1 = np.repeat(item, 20, axis=0)

    all_arr1 = np.concatenate(([all_arr1 , new_one_arr1 ]))
    ind = np.random.randint(one_arr2.shape[0], size=(20,))
    new_one_arr2= one_arr1[ind]

    new_one_arr1_list.append(new_one_arr1)
    new_one_arr2_list.append(new_one_arr2)

На каждом шаге итерации new_one_arr1 и new_one_arr2 они имеют размер 20x30x30x3.В конце концов, когда я конвертирую new_one_arr1_list и new_one_arr2_list, а размер - 100x20x30x30x3.Как я могу иметь 2000x30x30x3 в конце в массиве numpy?

РЕДАКТИРОВАТЬ: Я пытался использовать сцепление для добавления массивов в массив numpy all_arr1, используя: all_arr1= np.concatenate(([all_arr1, new_one_arr1])) однако,Я получил сообщение:

ValueError: все входные массивы должны иметь одинаковое количество измерений

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Чтобы создать конкатенацию и обойти ошибку, я инициализировал массив значением None и проверил, находится ли он в цикле None.Таким образом, вам не нужно беспокоиться о несоответствии размеров.Тем не менее, я создал несколько массивов для тех, которые вы только что описали, и в итоге получил окончание (400, 30, 30, 3).Это вписывается сюда, так как 20*20 = 400.Надеюсь, это поможет вам.

new_one_arr1_list = []
new_one_arr2_list = []
one_arr1 = np.ones((20,30,30,3))
one_arr2 = np.ones((20,30,30,3))
all_arr1 = None
count = 0
for item in one_arr1: # 100 iterations
    item = np.reshape(item, (1, 30, 30, 3))
    new_one_arr1 = np.repeat(item, 20, axis=0)

    # print(all_arr1.shape, new_one_arr1.shape)
    if all_arr1 is None:
        all_arr1 = new_one_arr1
    else:
        all_arr1 = np.concatenate(([all_arr1 , new_one_arr1 ]), axis=0)
    ind = np.random.randint(one_arr2.shape[0], size=(20,))
    new_one_arr2= one_arr1[ind]

    new_one_arr1_list.append(new_one_arr1)
    new_one_arr2_list.append(new_one_arr2)
    count += 1
print(count)
all_arr1.shape
0 голосов
/ 17 октября 2018

Используйте операцию np.concatenate, приведенную в документации: https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.concatenate.html

Не объединяйте в первой итерации, это вызовет ошибку измерения, просто скопируйте ее во время первого итератора.Для остальных итераций продолжайте конкатенацию.

new_one_arr1_list = []
new_one_arr2_list = []
all_arr1 = np.array([])
firstIteration = True
for item in one_arr1: # 100 iterations


    item = np.reshape(item, (1, 30, 30, 3))
    new_one_arr1 = np.repeat(item, 20, axis=0)

    if firstIteration:
        all_arr1 = new_one_arr1
        firstIteration=False
    else:
        all_arr1 = np.concatenate(([all_arr1 , new_one_arr1 ]))
    ind = np.random.randint(one_arr2.shape[0], size=(20,))
    new_one_arr2= one_arr1[ind]

    new_one_arr1_list.append(new_one_arr1)
    new_one_arr2_list.append(new_one_arr2)
...