Добавить один элемент в массив в numpy

122

У меня есть массив numpy, содержащий:

[1, 2, 3]

Я хочу создать массив, содержащий:

[1, 2, 3, 1]

То есть я хочу добавить первый элемент в конец массива.

Я пробовал очевидное:

np.concatenate((a, a[0]))

Но я получаю сообщение об ошибке ValueError: arrays must have same number of dimensions

Я этого не понимаю - оба массива - это всего лишь 1d массивы.

robintw
источник
1
np.insert([1,2,3], 3, 1)
Sparkler

Ответы:

163

append() создает новый массив, который может быть старым массивом с добавленным элементом.

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

a = numpy.append(a, a[0])
steabert
источник
29
Эта команда не изменяет aмассив. Однако он возвращает новый измененный массив. Так что, если a требуется модификация, ее a = numpy.append(a,a[0])нужно использовать.
Амджад
np.appendиспользует np.concatenate. Это просто гарантирует, что аддон имеет одно измерение. Ошибка OP имела a[0]0 размеров.
hpaulj
Почему добавление создает целый новый массив, если я просто хочу добавить один элемент?
ed22
Мне не нравится тот факт, что нам нужно вызывать другую функцию для такой простой команды. Было бы лучше, если бы в самом массиве был внутренний метод, например a.append(1), a.add(1)или даже что-то подобное спискам, напримерa + [1]
Фернандо Виттманн,
17

При добавлении только один раз или один раз время от времени использование np.appendв вашем массиве должно быть нормальным. Недостатком этого подхода является то, что память выделяется для совершенно нового массива каждый раз, когда он вызывается. При увеличении массива для значительного количества выборок было бы лучше либо предварительно выделить массив (если известен общий размер), либо добавить в список и преобразовать в массив впоследствии.

Использование np.append:

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Используя преобразование списка Python в массив после этого:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Предварительное выделение массива numpy:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

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

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Юрген Стрыдом
источник
14

a[0]не является массивом, это первый элемент aи поэтому не имеет размеров.

Попробуйте использовать a[0:1]вместо этого, который вернет первый элемент aвнутри одного массива элементов.

DMA57361
источник
12

Попробуй это:

np.concatenate((a, np.array([a[0]])))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

concatenate требует, чтобы оба элемента были массивами numpy; однако [0] не является массивом. Вот почему это не работает.

reader_1000
источник
Или, проще говоря np.concatenate((a, [a[0]])). В любом случае список будет преобразован в массив автоматически, что сэкономит вам время на вводе текста.
Безумный физик
10

Эта команда,

numpy.append(a, a[0])

не изменяет aмассив. Однако он возвращает новый измененный массив. Итак, если aтребуется модификация, необходимо использовать следующее.

a = numpy.append(a, a[0])
Амджад
источник
3

Это может быть немного излишним, но я всегда использую эту np.takeфункцию для любой циклической индексации:

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])
Саймон Штрайхер
источник
2

Допустим, a=[1,2,3]и вы этого хотите [1,2,3,1].

Вы можете использовать встроенную функцию добавления

np.append(a,1)

Здесь 1 - это int, это может быть строка, которая может принадлежать или не принадлежать элементам в массиве. Печать:[1,2,3,1]

Нандан Кулкарни
источник
Добро пожаловать в StackOverflow! Возможно, вы захотите прочитать это руководство о том, как отформатировать код, а затем обновить свой ответ, чтобы он был более читабельным :) Также это очень старый вопрос с принятым ответом, лучше ответить на некоторые новые
0mpurdy
0

Если вы хотите добавить элемент, используйте append()

a = numpy.append(a, 1) в этом случае добавьте 1 в конец массива

Если вы хотите вставить элемент, используйте insert()

a = numpy.insert(a, index, 1) в этом случае вы можете поместить 1 там, где хотите, используя index для установки позиции в массиве.

Адеджонг
источник