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 le faire facilement dans NumPy?
a = np.random.rand((N,N))
àa = np.random.rand(N,N)
np.r_[ ... ]
etnp.c_[ ... ]
sont des alternatives utiles àvstack
ethstack
avec des crochets [] au lieu de round ().Quelques exemples:
(La raison des crochets [] au lieu de round () est que Python se développe par exemple 1: 4 en carré - les merveilles de la surcharge.)
la source
np.c_[ * iterable ]
; voir les listes d'expressions .Utilisation
numpy.append
:la source
append
appelle justeconcatenate
Une façon, en utilisant hstack , est:
la source
dtype
paramètre, il n'est pas nécessaire et même interdit. Bien que votre solution soit suffisamment élégante, faites attention à ne pas l'utiliser si vous devez "ajouter" fréquemment à une baie. Si vous ne pouvez pas créer le tableau entier à la fois et le remplir plus tard, créez une liste de tableaux ethstack
tout cela à la fois.Je trouve ce qui suit le plus élégant:
Un avantage
insert
est qu'il vous permet également d'insérer des colonnes (ou lignes) à d'autres endroits à l'intérieur du tableau. De plus, au lieu d'insérer une seule valeur, vous pouvez facilement insérer un vecteur entier, par exemple dupliquer la dernière colonne:Qui conduit à:
Pour le timing,
insert
pourrait être plus lent que la solution de JoshAdel:la source
insert(a, -1, ...)
pour ajouter la colonne. Je suppose que je vais juste le préparer à la place.a.shape[axis]
. C'est à dire. pour ajouter une ligne, vous le faitesnp.insert(a, a.shape[0], 999, axis=0)
et pour une colonne, vous le faitesnp.insert(a, a.shape[1], 999, axis=1)
.J'ai également été intéressé par cette question et j'ai comparé la vitesse de
qui font tous la même chose pour n'importe quel vecteur d'entrée
a
. Délais de croissancea
:Notez que toutes les variantes non contiguës (en particulier
stack
/vstack
) sont finalement plus rapides que toutes les variantes contiguës.column_stack
(pour sa clarté et sa vitesse) semble être une bonne option si vous avez besoin de contiguïté.Code pour reproduire l'intrigue:
la source
stack
,hstack
,vstack
,column_stack
,dstack
sont toutes les fonctions d'aide construites surnp.concatenate
. En traçant la définition de la pile, j'ai trouvé que celanp.stack([a,a])
appelaitnp.concatenate([a[None], a[None]], axis=0)
. Il pourrait être intéressant d'ajouternp.concatenate([a[None], a[None]], axis=0).T
au perfplot pour montrer qu'ilnp.concatenate
peut toujours être au moins aussi rapide que ses fonctions d'aide.c_
etcolumn_stack
Je pense:
est plus élégant.
la source
np.concatenate fonctionne également
la source
np.concatenate
semble être 3 fois plus rapide quenp.hstack
pour les matrices 2x1, 2x2 et 2x3.np.concatenate
était également très légèrement plus rapide que la copie manuelle des matrices dans une matrice vide dans mes expériences. Cela correspond à la réponse de Nico Schlömer ci-dessous.En supposant
M
est un (100,3) ndarray ety
est un (100,) ndarrayappend
peut être utilisé comme suit:L'astuce consiste à utiliser
Cela se transforme
y
en un tableau 2D (100, 1).donne maintenant
la source
J'aime la réponse de JoshAdel en raison de l'accent mis sur la performance. Une amélioration mineure des performances consiste à éviter la surcharge d'initialisation avec des zéros, pour être écrasée uniquement. Cela a une différence mesurable lorsque N est grand, vide est utilisé au lieu de zéros et la colonne de zéros est écrite comme une étape distincte:
la source
b[:,-1] = 0
. De plus, avec de très grands tableaux, la différence de performancesnp.insert()
devient négligeable, ce qui peut êtrenp.insert()
plus souhaitable en raison de sa brièveté.np.insert
sert également le but.Il insère des valeurs, ici
new_col
, devant un indice donné, ici leidx
long d'un axe. En d'autres termes, les valeurs nouvellement insérées occuperont laidx
colonne et déplaceront celles qui s'y trouvaient à l'origine à et aprèsidx
.la source
insert
n'est pas en place comme on pourrait le supposer étant donné le nom de la fonction (voir les documents liés dans la réponse).Ajoutez une colonne supplémentaire à un tableau numpy:
La
np.append
méthode de Numpy prend trois paramètres, les deux premiers sont des tableaux numpy 2D et le 3ème est un paramètre d'axe indiquant sur quel axe ajouter:Tirages:
la source
Un peu tard pour la fête, mais personne n'a encore posté cette réponse, donc par souci d'exhaustivité: vous pouvez le faire avec des listes de compréhension, sur un tableau Python simple:
la source
Pour moi, la prochaine façon semble assez intuitive et simple.
la source
Dans mon cas, j'ai dû ajouter une colonne d'un à un tableau NumPy
Après X.shape => (97, 2)
la source
Il existe une fonction spécialement pour cela. Il s'appelle numpy.pad
Voici ce qu'il dit dans la docstring:
la source