356 votes

Comment créer un tableau/matrice vide dans NumPy ?

Je n'arrive pas à comprendre comment utiliser un tableau ou une matrice comme je le ferais normalement avec une liste. Je veux créer un tableau (ou une matrice) vide, puis y ajouter une colonne (ou une ligne) à la fois.

Pour l'instant, le seul moyen que j'ai trouvé pour le faire est le suivant :

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

Alors que si c'était une liste, je ferais quelque chose comme ça :

list = []
for item in data:
    list.append(item)

Y a-t-il un moyen d'utiliser ce genre de notation pour NumPy tableaux ou matrices ?

495voto

Stephen Simmons Points 1921

Vous avez le mauvais modèle mental pour utiliser NumPy efficacement. Les tableaux NumPy sont stockés dans des blocs de mémoire contigus. Si vous souhaitez ajouter des lignes ou des colonnes à un tableau existant, l'ensemble du tableau doit être copié dans un nouveau bloc de mémoire, créant ainsi des espaces pour le stockage des nouveaux éléments. Cette opération est très inefficace si elle est répétée pour construire un tableau.

Dans le cas de l'ajout de lignes, le mieux est de créer un tableau aussi grand que votre ensemble de données, puis d'y affecter des données ligne par ligne :

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

136 votes

Il y a aussi numpy.empty() si vous n'avez pas besoin de mettre le tableau à zéro.

24 votes

Quel est l'avantage d'utiliser empty() plutôt que zeros() ?

50 votes

que si vous l'initialisez directement avec vos données, vous économisez le coût de la mise à zéro.

112voto

Greg Ball Points 970

Un tableau NumPy est une structure de données très différente d'une liste et est conçu pour être utilisé de différentes manières. Votre utilisation de hstack est potentiellement très inefficace... à chaque fois que vous l'appelez, toutes les données du tableau existant sont copiées dans un nouveau tableau. (Le append aura le même problème). Si vous voulez construire votre matrice une colonne à la fois, il est préférable de la conserver dans une liste jusqu'à ce qu'elle soit terminée, et de ne la convertir qu'ensuite en tableau.

par exemple

mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

item peut être une liste, un tableau ou n'importe quel itérable, du moment que que chaque item a le même nombre d'éléments.
Dans ce cas particulier ( data est un itérable contenant les colonnes de la matrice) vous pouvez simplement utiliser

mat = numpy.array(data)

(Notez également que l'utilisation de list comme nom de variable n'est probablement pas une bonne pratique car elle masque le type intégré par ce nom, ce qui peut conduire à des bogues).

EDIT :

Si, pour une raison quelconque, vous voulez vraiment créer un tableau vide, vous pouvez simplement utiliser numpy.array([]) mais c'est rarement utile !

1 votes

Les tableaux/matrices numpy sont-ils fondamentalement différents de ceux de Matlab ?

3 votes

Si, pour une raison quelconque, vous avez besoin de définir un tableau vide, mais de largeur fixe (par ex. np.concatenate() ), vous pouvez utiliser : np.empty((0, some_width)) . 0, donc votre premier tableau ne sera pas un déchet.

66voto

Franck Dernoncourt Points 4769

Pour créer un tableau multidimensionnel vide dans NumPy (par exemple, un tableau 2D m*n pour stocker votre matrice), dans le cas où vous ne savez pas m combien de lignes vous allez ajouter et ne vous souciez pas du coût de calcul mentionné par Stephen Simmons (à savoir la reconstruction du tableau à chaque ajout), vous pouvez réduire à 0 la dimension à laquelle vous voulez ajouter : X = np.empty(shape=[0, n]) .

De cette façon, vous pouvez utiliser par exemple (ici m = 5 que nous supposons ne pas avoir connu lors de la création de la matrice vide, et n = 2 ) :

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

qui vous donnera :

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

2 votes

Ceci devrait être la réponse à la question posée par OP, pour le cas d'utilisation où vous ne connaissez pas le nombre de rangées à l'avance, ou si vous voulez gérer le cas où il y a 0 rangée.

0 votes

Bien que cela réponde à la demande du PO, ce n'est pas une bonne réponse. Si vous connaissez la plage d'itération, vous connaissez la taille du tableau cible.

26voto

Andrei Paga Points 21

Je me suis beaucoup penché sur la question car j'avais besoin d'utiliser un numpy.array comme ensemble dans un de mes projets scolaires et j'avais besoin d'être initialisé vide... Je n'ai pas trouvé de réponse pertinente ici sur Stack Overflow, alors j'ai commencé à gribouiller quelque chose.

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

Le résultat sera :

In [34]: x
Out[34]: array([], dtype=float64)

Vous pouvez donc initialiser directement un tableau np comme suit :

In [36]: x= np.array([], dtype=np.float64)

J'espère que cela vous aidera.

1 votes

Cela ne fonctionne pas pour les tableaux, comme dans la question, mais cela peut être utile pour les vecteurs.

1 votes

a=np.array([]) semble être par défaut float64

9voto

Il-Bhima Points 5757

Vous pouvez utiliser la fonction append. Pour les lignes :

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

Pour les colonnes :

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

EDIT
Bien sûr, comme mentionné dans d'autres réponses, à moins que vous ne fassiez un traitement (ex. inversion) sur la matrice/le tableau CHAQUE fois que vous y ajoutez quelque chose, je créerais simplement une liste, j'y ajouterais quelque chose puis je la convertirais en tableau.

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