Aggiungi un singolo elemento all'array in numpy


122

Ho un array numpy contenente:

[1, 2, 3]

Voglio creare un array contenente:

[1, 2, 3, 1]

Cioè, voglio aggiungere il primo elemento alla fine dell'array.

Ho provato l'ovvio:

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

Ma ottengo un errore che dice ValueError: arrays must have same number of dimensions

Non lo capisco: gli array sono entrambi solo array 1d.


1
np.insert([1,2,3], 3, 1)
Sparkler

Risposte:


163

append() crea un nuovo array che può essere il vecchio array con l'elemento aggiunto.

Penso che sia più normale utilizzare il metodo corretto per aggiungere un elemento:

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

29
Questo comando non altera l' aarray. Tuttavia, restituisce un nuovo array modificato. Quindi, se a è necessaria una modifica, è necessario a = numpy.append(a,a[0])utilizzare.
Amjad

np.appendusi np.concatenate. Si assicura solo che l'addon abbia una dimensione. L'errore OP era che a[0]ha 0 dimensioni.
hpaulj

Perché append crea un intero nuovo array se voglio solo aggiungere un elemento?
ed22

Non mi piace il fatto che dobbiamo chiamare un'altra funzione per un comando così semplice. Sarebbe più bello se ci fosse un metodo interno nell'array stesso come a.append(1), a.add(1)o anche qualcosa di analogo a elenchi comea + [1]
Fernando Wittmann,

17

Quando si aggiunge solo una o una volta di tanto in tanto, l'uso np.appendsull'array dovrebbe andare bene. Lo svantaggio di questo approccio è che la memoria viene allocata per un array completamente nuovo ogni volta che viene chiamato. Quando si cresce un array per una quantità significativa di campioni, sarebbe meglio pre-allocare l'array (se la dimensione totale è nota) o aggiungerlo a un elenco e convertirlo in un array in seguito.

Utilizzando 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)

Utilizzando l'elenco Python che converte in array in seguito:

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)

Pre-allocazione dell'array 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)

Quando la dimensione finale è sconosciuta, la pre-allocazione è difficile, ho provato a pre-allocare in blocchi di 50 ma non si è avvicinato all'utilizzo di un elenco.

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

14

a[0]non è un array, è il primo elemento di ae quindi non ha dimensioni.

Prova a usare a[0:1]invece, che restituirà il primo elemento aall'interno di un singolo array di elementi.



10

Questo comando,

numpy.append(a, a[0])

non altera l' aarray. Tuttavia, restituisce un nuovo array modificato. Quindi, se aè necessaria una modifica, è necessario utilizzare quanto segue.

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


3

Questo potrebbe essere un po 'eccessivo, ma io uso sempre la np.takefunzione per qualsiasi indicizzazione avvolgente:

>>> 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

Diciamo a=[1,2,3]e tu vuoi che sia [1,2,3,1].

È possibile utilizzare la funzione di aggiunta incorporata

np.append(a,1)

Qui 1 è un int, può essere una stringa e può appartenere o meno agli elementi dell'array. stampe:[1,2,3,1]


Benvenuto in StackOverflow! Potresti voler leggere questa guida su come formattare il codice e quindi aggiornare la tua risposta in modo che sia più leggibile :) Anche questa è una domanda molto vecchia con una risposta accettata, meglio rispondere ad alcune nuove
0mpurdy

0

Se vuoi aggiungere un elemento usa append()

a = numpy.append(a, 1) in questo caso aggiungere l'1 alla fine dell'array

Se vuoi inserire un elemento usa insert()

a = numpy.insert(a, index, 1) in questo caso puoi mettere l'1 dove desideri, usando index per impostare la posizione nell'array.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.