Какой самый быстрый способ сложить пустые массивы в цикле? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть код, который генерирует меня в цикле for из двух числовых массивов (data_transform).В первом цикле генерируется пустой массив (40, 2), а во втором цикле один из (175, 2).Я хочу объединить эти два массива в один, чтобы получить массив (215, 2).Я пробовал с np.concatenate и с np.append, но это выдает ошибку, поскольку массивы должны быть одинакового размера.Вот пример того, как я делаю код:

result_arr = np.array([])

for label in labels_set:
    data = [index for index, value in enumerate(labels_list) if value == label]
    for i in data:
        sub_corpus.append(corpus[i])
    data_sub_tfidf = vec.fit_transform(sub_corpus) 
    data_transform = pca.fit_transform(data_sub_tfidf) 
    #Append array
    sub_corpus = []

Я также использовал np.row_stack, но ничто другое не дает мне значение (175, 2), которое является вторым массивом, который я хочу объединить.

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

Что @hpaulj пытался сказать с помощью

Палка со списком, добавляемая при выполнении циклов.

- это

#use a normal list
result_arr = []

for label in labels_set:

    data_transform = pca.fit_transform(data_sub_tfidf) 

    # append the data_transform object to that list
    # Note: this is not np.append(), which is slow here
    result_arr.append(data_transform)

# and stack it after the loop
# This prevents slow memory allocation in the loop. 
# So only one large chunk of memory is allocated since
# the final size of the concatenated array is known.

result_arr = np.concatenate(result_arr)

# or 
result_arr = np.stack(result_arr, axis=0)

# or
result_arr = np.vstack(result_arr)

Ваши массивы donдействительно не имеют разные размеры.У них есть одно другое измерение, другое идентично.И в этом случае вы всегда можете сложить вдоль «другого» измерения.

0 голосов
/ 24 сентября 2019

Если у вас есть массив a размера (40, 2) и массив b размера (175,2), вы можете просто получить окончательный массив размером (215, 2), используя np.concatenate([a,b]).

0 голосов
/ 24 сентября 2019

Использование сцепления, инициализация "c":

a = np.array([[8,3,1],[2,5,1],[6,5,2]])
b = np.array([[2,5,1],[2,5,2]])
matrix = [a,b]

c = np.empty([0,matrix[0].shape[1]])

for v in matrix:
    c = np.append(c, v, axis=0)

Вывод:

[[8. 3. 1.]
 [2. 5. 1.]
 [6. 5. 2.]
 [2. 5. 1.]
 [2. 5. 2.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...