Додайте один елемент до масиву numpy


122

У мене є масивний масив, що містить:

[1, 2, 3]

Я хочу створити масив, що містить:

[1, 2, 3, 1]

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

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

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

Але я отримую повідомлення про помилку ValueError: arrays must have same number of dimensions

Я цього не розумію - масиви - це лише 1d масиви.


1
np.insert([1,2,3], 3, 1)
Спарклер

Відповіді:


163

append() створює новий масив, який може бути старим масивом із доданим елементом.

Я думаю, що нормальніше використовувати правильний метод для додавання елемента:

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

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)

Використання пітонного списку, який перетворюється на масив після цього:

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всередині одного масиву елементів.


12

Спробуйте це:

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

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

об'єднати потрібні обидва елементи, щоб бути масивними масивами; однак, [0] - це не масив. Ось чому це не працює.


Або, простіше кажучи 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! Ви можете прочитати цей посібник про те, як відформатувати код, а потім оновити свою відповідь, щоб вона була більш зрозумілою :) Також це дуже старе питання з прийнятою відповіддю, краще відповісти на деякі нові
0:00 в

0

Якщо ви хочете додати елемент використання append()

a = numpy.append(a, 1) у цьому випадку додайте 1 в кінці масиву

Якщо ви хочете вставити елемент, використовуйте insert()

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.