#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
, по умолчанию будет использоваться 0concatenate()
, что для нас будет работать просто отлично.
Ответ №4:
вы должны поступить следующим образом.
arr = [old array]
newArr = numpy.append(arr, [new_array])
Использование функции append будет работать.