Добавление нового столбца в пустой массив NumPy - PullRequest
0 голосов
/ 01 ноября 2018

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

У меня есть пустой массив NumPy такой, что:

array1 = np.array([])

Скажем, у меня есть данные, которые имеют форму (100, 100), и я хочу добавить каждый столбец к array1 один за другим. Однако, если я сделаю, например:

array1 = np.append(array1, some_data[:, 0])
array1 = np.append(array1, some_data[:, 1])

Я заметил, что я получу не матрицу (100, 2), а массив (200,). Поэтому я попытался указать axis как

array1 = np.append(array1, some_data[:, 0], axis=1)

, который производит AxisError: axis 1 is out of bounds for array of dimension 1.


Далее я попытался использовать метод np.c_[]:

array1 = np.c_[array1, somedata[:, 0]]

, что дает мне ValueError: all the input array dimensions except for the concatenation axis must match exactly.


Можно ли как-нибудь последовательно добавить столбцы в массив NumPy?

Спасибо.


EDIT

Я узнал, что мой первоначальный вопрос не содержал достаточно информации, чтобы другие могли предложить помощь, и сделал это обновление, чтобы исправить первоначальную ошибку.

Моя большая цель - создать программу, которая выбирает функции «жадным способом». По сути, я пытаюсь взять матрицу проектирования some_data, которая представляет собой матрицу (100, 100), содержащую числа с плавающей запятой в качестве записей, и подгонять модель линейной регрессии с растущим числом функций, пока не найду лучший набор функций.

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

Это то, что я пытаюсь сделать в своей голове, но я застрял с самого начала с проблемой, которую я упомянул.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы начинаете с массива (0,) и (n,) в форме:

In [482]: arr1 = np.array([])
In [483]: arr1.shape
Out[483]: (0,)
In [484]: arr2 = np.array([1,2,3])
In [485]: arr2.shape
Out[485]: (3,)

np.append использует concatenate (но с некоторыми забавными делами, когда ось не указана):

In [486]: np.append(arr1, arr2)
Out[486]: array([1., 2., 3.])
In [487]: np.append(arr1, arr2,axis=0)    
Out[487]: array([1., 2., 3.])
In [489]: np.concatenate([arr1, arr2])
Out[489]: array([1., 2., 3.])

И пробная ось = 1

In [488]: np.append(arr1, arr2,axis=1)
---------------------------------------------------------------------------
AxisError                                 Traceback (most recent call last)
<ipython-input-488-457b8657453e> in <module>()
----> 1 np.append(arr1, arr2,axis=1)

/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in append(arr, values, axis)
   4526         values = ravel(values)
   4527         axis = arr.ndim-1
-> 4528     return concatenate((arr, values), axis=axis)

AxisError: axis 1 is out of bounds for array of dimension 1

Просмотрите все сообщение - ошибка возникает на шаге concatenate. Вы не можете объединить 1d массивы вдоль axis=1.

Использование np.append или даже np.concatenate итеративно медленно (каждый раз он создает новый массив), и его трудно правильно инициализировать. Это плохая замена для широко используемого списка append-to-empty-list рецепт.

np.c_ - это просто функция обложки для concatenate.

Не существует только одного empty массива. np.array([[]]) и np.array([[[]]]) также имеют 0 элементов.

Если вы хотите добавить столбец в массив, вам нужно начать с 2d массива, а столбец также должен быть 2d.

Вот пример правильной конкатенации 2-мерных массивов:

In [490]: np.concatenate([ np.zeros((3,0),int), np.arange(3)[:,None]], axis=1)
Out[490]: 
array([[0],
       [1],
       [2]])

column_stack - это еще одна функция обложки для concatenate, которая обеспечивает входы 2d. Но даже с этим получить начальный «пустой» массив сложно.

In [492]: np.column_stack([np.zeros(3,int), np.arange(3)])
Out[492]: 
array([[0, 0],
       [0, 1],
       [0, 2]])
In [493]: np.column_stack([np.zeros((3,0),int), np.arange(3)])
Out[493]: 
array([[0],
       [1],
       [2]])

np.c_ очень похоже на column_stack, но реализовано по-другому:

In [496]: np.c_[np.zeros(3,int), np.arange(3)]
Out[496]: 
array([[0, 0],
       [0, 1],
       [0, 2]])

Основное сообщение заключается в том, что при использовании np.concatenate необходимо обращать внимание на размеры. Его варианты позволяют вам немного выдумывать, но вам действительно нужно понимать, что обманчивость помогает сделать все правильно, особенно когда вы начинаете с этой плохо определенной идеи «пустого» массива.

0 голосов
/ 01 ноября 2018

Я обычно использую метод конкатенации и делаю это так:

# Some stuff
alldata = None
....
array1 = np.random.random((100,1))
if alldata is None: alldata = array1
...
array2 = np.random.random((100,1))

alldata = np.concatenate((alldata,array2),axis=1)   

В случае, если вы работаете с векторами:

alldata = None
....
array1 = np.random.random((100,))
if alldata is None: alldata = array1[:,np.newaxis]
...
array2 = np.random.random((100,))

alldata = np.concatenate((alldata,array2[:,np.newaxis]),axis=1)   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...