Добавить одномерный массив numpy в новое значение x двумерного массива numpy

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

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

Пример:

all_polys = [[5,6],[8,9]] ( до приведенной ниже ошибки в нем еще ничего не сохранено)

poly = [1,2]

Ожидаемый результат:

all_polys = [[5,6],[8,9],[1,2]]

Мой код:

 all_polys = numpy.array([[]])
poly = np.expand_dims(poly, axis=0)
print(poly)
print(all_polys)
all_polys = np.concatenate(all_polys, poly)
  

Ошибка:

Ошибка типа: только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс

Вывести вывод перед ошибкой:

[[‘400’ ‘815’ ‘650’ ‘815’ ‘650’ ‘745’ ‘400’ ‘745’]] ( поли с добавленным измерением)

[] (all_polies)

Это действительно расстраивает меня. Что я делаю не так? Наверное, я упустил из виду небольшую деталь.

Комментарии:

1. all_polys Начинается как список [[5,6],[8,9] , как массив np.array([[5,6,8,9]]) или как эта бесполезная вещь np.array([[]]) ? Это poly список [1,2] или массив, np.array([1,2]) ?

2. all_polys начинался как «бесполезная вещь», а poly был массивом, заполненным гибким количеством чисел. Я изменил его, так что all_polys становится избыточным. Вместо этого инициируется список с определенным количеством элементов, к которому я добавляю дополнительные списки.

Ответ №1:

Начиная с 2d-массива и 1d-массива:

 In [26]: all_polys = np.array([[5,6],[8,9]])                                    
In [27]: poly = np.array([1,2])                                                 
  

vstack отлично справляется с тем, чтобы убедиться, что все входные данные являются 2d, а затем объединить:

 In [28]: np.vstack((all_polys, poly))                                           
Out[28]: 
array([[5, 6],
       [8, 9],
       [1, 2]])
  

У вас были правильные ide с expand_dims :

 In [29]: np.concatenate((all_polys, np.expand_dims(poly, axis=0)))              
Out[29]: 
array([[5, 6],
       [8, 9],
       [1, 2]])
  

Но np.array([[]]) это плохая отправная точка. Зачем это использовать? Вы делаете это итеративно?

Для итеративной работы мы рекомендуем использовать списки:

 In [30]: alist = []                                                             
In [31]: alist.append([5,6])                                                    
In [32]: alist.append([8,9])                                                    
In [33]: alist.append([1,2])                                                    
In [34]: np.array(alist)                                                        
Out[34]: 
array([[5, 6],
       [8, 9],
       [1, 2]])
  

Я не рекомендую использовать np.append . Этим слишком часто злоупотребляют.

Комментарии:

1. @hpaulj: Приятно. Был удивлен вашим использованием vstack со смесью 2d и 1d массивов. Ожидалось, что он выдаст ошибку, поскольку, похоже, он не удовлетворяет правилу «Массивы должны иметь одинаковую форму вдоль всех, кроме первой оси» — они даже не имеют одинакового ранга.

Ответ №2:

Вы можете попробовать функцию append вместо expand_dims

 import numpy as np
all_polys = [[5,6],
             [8,9]]
all_polys = np.append(all_polys,[ [1,2] ], axis=0)
print(all_polys)
#Output=
#all_polys = [[5,6],
#             [8,9],
#             [1,2]]
  

Ответ №3:

Вам просто нужно сделать это:

 all_polys = np.concatenate((all_polys, poly[None,:]), axis=0)
  

Два массива, которые мы объединяем, — это all_polys , который выглядит как [[5,6],[8,9]] , и poly[None,:] , который выглядит как [[1.2]] .

axis=0 Мы указываем, что конкатенация должна происходить по самому внешнему (первому) измерению этих массивов.

Комментарии:

1. Есть ли также способ сделать это с массивами с другим количеством сохраненных записей? Например, all_polys = [[1,4]] и poly = [7,8,4,3] для создания [[1,4],[7,8,4,3]]? Я получаю ошибку значения: все размеры входного массива, за исключением оси конкатенации, должны точно совпадать

2. Для примера в вашем вопросе массивы уже имеют разное количество сохраненных элементов. all_polys имеет 4 элемента, и poly имеет 2 элемента. Я думаю, что вопрос в вашем комментарии сейчас касается выравнивания массивов перед объединением. Для этого вы можете использовать что-то вроде my_flat = np.concatenate((all_polys.ravel(), poly.ravel()), axis=0) . Кстати, если вы не пройдете axis=0 , по умолчанию будет использоваться 0 concatenate() , что для нас будет работать просто отлично.

Ответ №4:

вы должны поступить следующим образом.

 arr = [old array]
newArr = numpy.append(arr, [new_array])
  

Использование функции append будет работать.