Добавить массив numpy с разными первыми измерениями - PullRequest
1 голос
/ 17 февраля 2020

Моя программа создает массив numpy в пределах для l oop. Например, он создает массив с формой (100*30*10), затем (160*30*10), а затем может быть (120*30*10). Я должен добавить вышеупомянутое к пустому массиву numpy так, чтобы в конце l oop это был массив numpy с формой (380*30*10) (т.е. сумма 100 + 160 + 120). Второе и третье измерение не изменяется в массиве numpy.

Как я могу сделать выше в python. Я попробовал следующее.

np_model = np.append(np_model,np_temp1)
print("Appended model shape is",np_model.shape)
np_label = np.append(np_label,np_temp2)
print("Appended label shape is",np_label.shape)

np_model - это пустой массив, который я определил как np_model = np.empty(1,30,10), а np_label как np_label = np.empty(1 ,str)

np_temp1 соответствует массиву в каждом для l oop как 100*30*10, 120*30*10 и т. д. 1036 * и np_temp2 - строка с «item1», «item2» и т. д. 1037 *

np_label - это строка numpy массив с 1 меткой, соответствующей np_temp1.shape[0]. Но результат, который я получаю в np_model, - это уплощенный массив размером 380*30*10 = 1140000

. Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2020

Вы можете использовать функцию numpy concatenate, добавить вывод numpy (s) в список и затем передать его в функцию concatenate:

empty_list = []
x = np.zeros([10, 20, 4])
y = np.zeros([12, 20, 4])
empty_list.append(x)
empty_list.append(y)
z = np.concatenate(empty_list, axis=0)
print(x.shape, y.shape, z.shape)

( 10, 20, 4) (12, 20, 4) (22, 20, 4)

0 голосов
/ 17 февраля 2020

Чтобы конкретно ответить на ваш вопрос, начиная с пустого массива, это было бы моим решением, используя только np.concatenate:

import numpy as np

# Some arrays to append in a loop
arrays = (
    np.random.rand(100, 30, 10),
    np.random.rand(160, 30, 10),
    np.random.rand(120, 30, 10)
)

# Initial empty array
array = np.zeros((0, 30, 10))

# Appending arrays in loop
for a in arrays:
    array = np.concatenate((array, a), axis=0)

# Output shape
print(array.shape)

Вывод:

(380, 30, 10)

Надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
----------------------------------------
0 голосов
/ 17 февраля 2020

Как предложил @Nullman в комментарии (np.vstack)

Вы можете создать пустой массив, подобный этому >>> np_model = np.empty((0,30,10))

>>> np_model = np.empty((0,30,10))

>>> a = np.random.rand(100,30,10)
>>> b = np.random.rand(160,30,10)
>>> c = np.random.rand(120,30,10)

# It can done by one-line like`np_model = np.vstack((a,b,c))`
# but i guess you have loop dependency here
>>> np_model = np.vstack((np_model,a))
>>> np_model = np.vstack((np_model,b))
>>> np_model = np.vstack((np_model,c))

>>> np_model.shape
(380, 30, 10)
...