440 votes

Comment ajouter une colonne supplémentaire à un tableau NumPy ?

Disons que j'ai un tableau NumPy, a :

a = np.array([
    [1, 2, 3],
    [2, 3, 4]
    ])

Et je voudrais ajouter une colonne de zéros pour obtenir un tableau, b :

b = np.array([
    [1, 2, 3, 0],
    [2, 3, 4, 0]
    ])

Comment puis-je faire cela facilement en NumPy ?

483voto

denis Points 7316

np.r_[ ... ] et np.c_[ ... ] sont des alternatives utiles à vstack et hstack , avec des crochets [] au lieu des ronds ().
Quelques exemples :

: import numpy as np
: N = 3
: A = np.eye(N)

: np.c_[ A, np.ones(N) ]              # add a column
array([[ 1.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.],
       [ 0.,  0.,  1.,  1.]])

: np.c_[ np.ones(N), A, np.ones(N) ]  # or two
array([[ 1.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  1.,  0.,  1.],
       [ 1.,  0.,  0.,  1.,  1.]])

: np.r_[ A, [A[1]] ]              # add a row
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  1.,  0.]])
: # not np.r_[ A, A[1] ]

: np.r_[ A[0], 1, 2, 3, A[1] ]    # mix vecs and scalars
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

: np.r_[ A[0], [1, 2, 3], A[1] ]  # lists
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

: np.r_[ A[0], (1, 2, 3), A[1] ]  # tuples
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

: np.r_[ A[0], 1:4, A[1] ]        # same, 1:4 == arange(1,4) == 1,2,3
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

(La raison de l'utilisation de crochets [] au lieu de rond () c'est que Python développe par exemple 1:4 en carré -- les merveilles de la surcharge).

13 votes

Je cherchais des informations à ce sujet, et c'est définitivement une meilleure réponse que celle acceptée, car elle couvre l'ajout d'une colonne supplémentaire au début et à la fin, et pas seulement à la fin comme les autres réponses.

2 votes

@Ay0 Exactement, je cherchais un moyen d'ajouter une unité de biais à mon réseau neuronal artificiel en lot sur toutes les couches à la fois, et c'est la réponse parfaite.

0 votes

Et si vous voulez ajouter n colonnes en un temps ?

230voto

JoshAdel Points 15911

Je pense qu'une solution plus simple et plus rapide à démarrer est de faire ce qui suit :

import numpy as np
N = 10
a = np.random.rand(N,N)
b = np.zeros((N,N+1))
b[:,:-1] = a

Et les horaires :

In [23]: N = 10

In [24]: a = np.random.rand(N,N)

In [25]: %timeit b = np.hstack((a,np.zeros((a.shape[0],1))))
10000 loops, best of 3: 19.6 us per loop

In [27]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 5.62 us per loop

27 votes

Je veux ajouter (985,1) shape np araay à (985,2) np array pour en faire (985,3) np array, mais ça ne marche pas. J'obtiens l'erreur "could not broadcast input array from shape (985) into shape (985,1)". Quel est le problème avec mon code ? Code : np.hstack(data, data1)

8 votes

@Outlier vous devriez poster une nouvelle question plutôt que d'en poser une dans les commentaires de celle-ci.

4 votes

@JoshAdel : J'ai essayé votre code sur ipython, et je pense qu'il y a une erreur de syntaxe. Vous pourriez essayer de changer a = np.random.rand((N,N)) à a = np.random.rand(N,N)

206voto

gemy Points 71

Utilisez numpy.append :

>>> a = np.array([[1,2,3],[2,3,4]])
>>> a
array([[1, 2, 3],
       [2, 3, 4]])

>>> z = np.zeros((2,1), dtype=int64)
>>> z
array([[0],
       [0]])

>>> np.append(a, z, axis=1)
array([[1, 2, 3, 0],
       [2, 3, 4, 0]])

3 votes

Cette fonction est utile pour l'insertion de colonnes plus complexes.

8 votes

Cette solution est plus simple que la réponse de @JoshAdel, mais elle est plus lente lorsque l'on traite de grands ensembles de données. Je choisirais entre les deux en fonction de l'importance de la lisibilité.

7 votes

append en fait, il ne fait qu'appeler concatenate

78voto

Peter Smit Points 5655

D'une part, en utilisant hstack c'est :

b = np.hstack((a, np.zeros((a.shape[0], 1), dtype=a.dtype)))

5 votes

Je pense que c'est la solution la plus élégante.

2 votes

+1 - c'est comme ça que je ferais - tu m'as devancé pour le poster comme réponse :).

3 votes

Retirer le dtype paramètre, il n'est pas nécessaire et même pas autorisé. Bien que votre solution soit assez élégante, faites attention à ne pas l'utiliser si vous avez besoin d'"ajouter" fréquemment à un tableau. Si vous ne pouvez pas créer le tableau entier en une fois et le remplir plus tard, créez une liste de tableaux et hstack tout d'un coup.

57voto

Björn Points 71

Je trouve la formule suivante très élégante :

b = np.insert(a, 3, values=0, axis=1) # Insert values before column 3

Un avantage de insert est qu'il vous permet également d'insérer des colonnes (ou des lignes) à d'autres endroits du tableau. De même, au lieu d'insérer une seule valeur, vous pouvez facilement insérer un vecteur entier, par exemple en dupliquant la dernière colonne :

b = np.insert(a, insert_index, values=a[:,2], axis=1)

Ce qui nous amène à :

array([[1, 2, 3, 3],
       [2, 3, 4, 4]])

Pour le timing, insert pourrait être plus lente que la solution de JoshAdel :

In [1]: N = 10

In [2]: a = np.random.rand(N,N)

In [3]: %timeit b = np.hstack((a, np.zeros((a.shape[0], 1))))
100000 loops, best of 3: 7.5 µs per loop

In [4]: %timeit b = np.zeros((a.shape[0], a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 2.17 µs per loop

In [5]: %timeit b = np.insert(a, 3, values=0, axis=1)
100000 loops, best of 3: 10.2 µs per loop

1 votes

C'est assez chouette. Dommage que je ne puisse pas faire insert(a, -1, ...) pour ajouter la colonne. Je suppose que je vais juste la prépayer à la place.

3 votes

@ThomasAhle Vous pouvez ajouter une ligne ou une colonne en obtenant la taille dans cet axe en utilisant a.shape[axis] . Par exemple, pour ajouter une ligne, vous faites np.insert(a, a.shape[0], 999, axis=0) et pour une colonne, on fait np.insert(a, a.shape[1], 999, axis=1) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X