Добавить один элемент в массив в NumPy - PullRequest
78 голосов
/ 07 сентября 2011

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

[1, 2, 3]

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

[1, 2, 3, 1]

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

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

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

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

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

Ответы [ 8 ]

120 голосов
/ 07 сентября 2011

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

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

a = numpy.append(a, a[0])
11 голосов
/ 07 сентября 2011

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

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

9 голосов
/ 07 сентября 2011

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

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

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

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

8 голосов
/ 19 марта 2018

При добавлении только один или один раз время от времени, использование 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)

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

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)
6 голосов
/ 16 октября 2017

Эта команда,

numpy.append(a, a[0])

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

a = numpy.append(a,a[0])

должен использоваться.

6 голосов
/ 22 сентября 2013
t = np.array([2, 3])
t = np.append(t, [4])
3 голосов
/ 25 января 2016

Это может быть немного излишним, но я всегда использую функцию 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])
1 голос
/ 26 июля 2017

Допустим, a=[1,2,3], и вы хотите, чтобы оно было [1,2,3,1].

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

np.append(a,1)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...