2015-06-09 2 views
1

В настоящее время я пытаюсь добавить несколько массивов Numpy вместе. В принципе, я хочу начать с матрицы (1 x m) (технически вектора) и заканчивать матрицей (n x m). Итак, переходим от n (1 x m) матриц (векторов) к одной (n x m) матрице (если это имеет смысл). Конечной целью этого является запись матрицы в csv-файл с помощью функции numpy.savetxt(), поэтому я получаю csv-файл с n столбцами длиной m.Добавление добавочных массивов numpy

Проблема заключается в том, что numpy.append() добавляет векторы вместе в вектор (1 x 2 м). Итак, скажем, a1 и a2 - массивы Numpy с 10000 элементами каждый. Я добавлю a2 в a1 с помощью функции append и одновременно создав новый массив с именем a, который содержит как a1, так и a2.

a=np.append(a1, a2, axis=0) 
a.shape 
>>(20000,) 

То, что я хочу, а не для формы, чтобы быть в форме

>>(2, 10000) 

или вообще

>>(n, m) 

Что я должен делать? Обратите внимание, что я хочу продолжить добавление векторов в массив. Спасибо за ваше время!

+0

Что является источником 'a1',' a2' и т. Д.? Все ли они существуют в начале этой операции, или вы должны генерировать 'a3' после того, как' a2' был создан и добавлен? – hpaulj

+0

Думаю, вам нужно больше поиграть с 'np.array ([...])' и 'np.reshape' и' np.concatenate'. Это строительные блоки для всех предложенных вариантов ('vstack',' column_stack', 'append'). Посмотрите на код Python, где он доступен. – hpaulj

ответ

1

вы можете использовать транспонирование numpy.column_stack

Например:

import numpy as np 

a=np.array([1,2,3,4,5]) 
b=np.array([9,8,7,6,5]) 
c=np.column_stack((a,b)).T 

print c 
>>> array([[1, 2, 3, 4, 5], 
      [9, 8, 7, 6, 5]]) 

print a.shape,b.shape,c.shape 
>>> (5,) (5,) (2, 5) 

EDIT:

вы можете добавлять столбцы так:

d=np.array([2,2,2,2,2]) 
c=np.column_stack((c.T,d)).T 
print c 
>>> array([[1, 2, 3, 4, 5], 
      [9, 8, 7, 6, 5], 
      [2, 2, 2, 2, 2]]) 
print c.shape 
>>> (3, 5) 
+0

Хммм. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу добавлять столбцы в c из-за проблемы с формой. Как я могу добавить эти (1 x m) векторы в матрицу (n x m) внутри цикла for? Поскольку на данный момент, если я, например, хочу добавить массив d (shape (1 x 5)) в c, я получу ошибку формы. ValueError: все размеры входного массива, кроме оси конкатенации, должны соответствовать точно –

+0

, вы можете добавить новый столбец c = np.column_stack ((c.T, d)). See my edit – tom

+0

Wohoo! Это похоже на работу! Большое спасибо. –

0

Это должно работа

a=np.append(a1, a2, axis=0).reshape(2,10000) 
a.shape 
>>(2,10000) 
0

Для того, чтобы объединить массивы вертикально Я хотел бы использовать np.vstack

import numpy as np 

np.vstack((a1,a2)) 

Однако, с моей точки зрения, numpy.array не должен создаваться с использованием for петли и добавляя новый массив к старому , Вместо этого, либо создать первые все numpy.array (пХты) и писать данные из цикла for в этот массив,

data = np.zeros((n,m)) 

for i in range(n): 
    data[i] = ... 

или первым создать массив как обычный список питона с помощью append который можно преобразовать в конец в numpy.array.

data = [] 

for i in range(n): 
    data.append(...) 

data = np.asarray(data) 
+0

Если 'a1',' a2' и т. Д. Все 1d массивы, то 'np.array ([a1, a2, a3, ..])' работает так же, как 'vstack'. Вот что делает ваш последний пример. 'vstack' будет лучше для инкрементной сборки (где один массив равен 2d, другой (ы) 1d). – hpaulj

+0

@hpaulj: Я не уверен, что вы имеете в виду ... Я просто говорю, что я использовал бы «np.vstack» вместо транспонированного «np.column_stack» в цикле 'for'. В другой части моего ответа я хочу только подчеркнуть, что подход в целом неэффективен с моей точки зрения (numpy). Вместо этого я бы использовал один из двух вариантов, которые я предлагаю ... – plonser

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