2009-12-15 6 views
6

Привет У меня есть серия данных 1000 с 1500 точками в каждом.Как добавить строки и столбцы в массив NUMPY?

Они формируют массив Numpy размером 1000x1500, созданный с использованием np.zeros ((1500, 1000)), а затем заполняется данными.

Теперь, если я хочу, чтобы массив вырос, чтобы сказать 1600 x 1100? Нужно ли добавлять массивы с помощью hstack и vstack или есть лучший способ?

Я бы хотел, чтобы данные, уже находящиеся в массиве размером 1000x1500, не подлежали изменению, в основном, только пустые данные (нули) добавлены в нижней и правой частях.

Спасибо.

ответ

3

Если вы хотите нули в добавленных элементах, my_array.resize((1600, 1000)) должен работать. Обратите внимание, что это отличается от numpy.resize(my_array, (1600, 1000)), в котором дублируются предыдущие строки, что, вероятно, не то, что вы хотите.

В противном случае (например, если вы хотите избежать инициализации элементов до нуля, что может быть ненужным), вы можете использовать hstack и vstack для добавления массива, содержащего новые элементы; numpy.concatenate() (см. Pydoc numpy.concatenate) тоже должен работать (это, как я понимаю, просто более общий.

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

+0

Просто обратите внимание, что это не означает, что данные сохраняются в том случае, когда вы просто хотите расширить набор данных: >>> a = numpy.array ([[1,2], [ 3,4]]) >>> a массив ([[1, 2], [3, 4]]) >>> a.resize ((2,4)) Traceback (последний звонок последний): Файл «», строка 1, в ValueError: не может изменять размеры ссылок на массивы или ссылается надругим массивом. Используйте функцию изменения размера >>> a = numpy.array (a) >>> a.resize ((2,4)) >>> a массив ([[1, 2, 3, 4], [0, 0, 0, 0]]) – mathtick

0

Вы должны использовать reshape() и/или resize() в зависимости от ваших точных требований.

Если вам нужна глава и стих от авторов, вам, вероятно, лучше не публиковать на дискуссионной доске numpy.

7

Это должно делать то, что вы хотите (т.е., используя массив 3х3 и массив 4x4, чтобы представить два массива в ОП)

>>> import numpy as NP 
>>> a = NP.random.randint(0, 10, 9).reshape(3, 3) 
>>> a 
>>> array([[1, 2, 2], 
      [7, 0, 7], 
      [0, 3, 0]]) 

>>> b = NP.zeros((4, 4)) 

отображение на б:

>>> b[:3,:3] = a 

>>> b 
    array([[ 1., 2., 2., 0.], 
      [ 7., 0., 7., 0.], 
      [ 0., 3., 0., 0.], 
      [ 0., 0., 0., 0.]]) 
+0

У меня есть ошибка из этого кода. Должна ли последняя строка быть b [: 3,: 3] = a?Все равно, плюс один с тех пор, как я это сделал, и это то, что я искал. –

+0

@ knives да, опечатка, спасибо - редактирование моего сообщения сейчас. – doug

2

Независимо от того, вы будете застревать, перераспределяя кусок памяти, поэтому не имеет значения, используете ли вы arr.resize(), np.concatenate , hstack/vstack и т. Д. Обратите внимание: если вы аккумулируете много данных последовательно, списки Python обычно более эффективны.