Ajouter un élément unique au tableau dans numpy

122

J'ai un tableau numpy contenant:

[1, 2, 3]

Je souhaite créer un tableau contenant:

[1, 2, 3, 1]

Autrement dit, je veux ajouter le premier élément à la fin du tableau.

J'ai essayé l'évidence:

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

Mais je reçois une erreur disant ValueError: arrays must have same number of dimensions

Je ne comprends pas cela - les tableaux ne sont que des tableaux 1d.

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

Réponses:

163

append() crée un nouveau tableau qui peut être l'ancien tableau avec l'élément ajouté.

Je pense qu'il est plus normal d'utiliser la bonne méthode pour ajouter un élément:

a = numpy.append(a, a[0])
steabert
la source
29
Cette commande ne modifie pas le atableau. Cependant, il renvoie un nouveau tableau modifié. Donc, si une a modification est nécessaire, elle a = numpy.append(a,a[0])doit être utilisée.
Amjad
np.appendutilise np.concatenate. Il s'assure simplement que l'addon a une dimension. L'erreur OP était le a[0]a 0 dimensions.
hpaulj
Pourquoi ajouter crée un tout nouveau tableau si je veux juste ajouter un élément?
ed22
Je n'aime pas le fait que nous devions appeler une autre fonction pour une commande aussi simple. Ce serait plus agréable s'il y avait une méthode interne dans le tableau lui-même a.append(1), a.add(1)ou même quelque chose d'analogue à des listes commea + [1]
Fernando Wittmann
17

Lorsque vous ajoutez une seule fois ou une fois de temps en temps, l'utilisation np.appendde votre tableau devrait être correcte. L'inconvénient de cette approche est que de la mémoire est allouée à un tout nouveau tableau à chaque fois qu'il est appelé. Lors de la croissance d'un tableau pour une quantité importante d'échantillons, il serait préférable de pré-allouer le tableau (si la taille totale est connue) ou de l'ajouter à une liste et de le convertir en tableau par la suite.

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

Utilisation de la conversion de liste python en tableau par la suite:

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)

Tableau numpy pré-alloué:

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)

Lorsque la taille finale n'est pas connue, la pré-allocation est difficile, j'ai essayé de pré-allouer par tranches de 50 mais cela ne s'est pas rapproché de l'utilisation d'une liste.

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

a[0]n'est pas un tableau, c'est le premier élément de aet n'a donc pas de dimensions.

Essayez d'utiliser à la a[0:1]place, qui retournera le premier élément de l' aintérieur d'un seul tableau d'éléments.

DMA57361
la source
12

Essaye ça:

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

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

concatenate a besoin que les deux éléments soient des tableaux numpy; cependant, un [0] n'est pas un tableau. Voilà pourquoi cela ne fonctionne pas.

reader_1000
la source
Ou, plus simplement np.concatenate((a, [a[0]])). De toute façon, la liste sera automatiquement promue dans un type de tableau, ce qui vous évitera de taper.
Mad Physicist
10

Cette commande,

numpy.append(a, a[0])

ne modifie pas le atableau. Cependant, il renvoie un nouveau tableau modifié. Donc, si une amodification est nécessaire, les éléments suivants doivent être utilisés.

a = numpy.append(a, a[0])
Amjad
la source
7
t = np.array([2, 3])
t = np.append(t, [4])
user2804741
la source
3

Cela peut être un peu excessif, mais j'utilise toujours la np.takefonction pour toute indexation enveloppante:

>>> 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])
Simon Streicher
la source
2

Disons a=[1,2,3]et vous voulez que ce soit le cas [1,2,3,1].

Vous pouvez utiliser la fonction d'ajout intégrée

np.append(a,1)

Ici, 1 est un entier, il peut s'agir d'une chaîne et il peut appartenir ou non aux éléments du tableau. Impressions:[1,2,3,1]

Nandan Kulkarni
la source
Bienvenue dans StackOverflow! Vous voudrez peut-être lire ce guide sur la façon de formater le code, puis mettre à jour votre réponse afin qu'elle soit plus lisible :) C'est aussi une très ancienne question avec une réponse acceptée, mieux vaut répondre à quelques nouvelles
0mpurdy
0

Si vous souhaitez ajouter un élément, utilisez append()

a = numpy.append(a, 1) dans ce cas, ajoutez le 1 à la fin du tableau

Si vous souhaitez insérer un élément, utilisez insert()

a = numpy.insert(a, index, 1) dans ce cas, vous pouvez placer le 1 où vous le souhaitez, en utilisant index pour définir la position dans le tableau.

adejonghm
la source