web-dev-qa-db-fra.com

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

Je n'arrive pas à comprendre comment utiliser un tableau ou une matrice de la même manière que je l'utilise normalement avec une liste. Je veux créer un tableau vide (ou une matrice), puis y ajouter une colonne (ou une ligne) à la fois.

Pour le moment, la seule façon de le faire est la suivante:

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)

Est-il possible d'utiliser ce type de notation pour NumPy tableaux ou matrices?

235
Ben

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, vous devez copier l'intégralité du tableau dans un nouveau bloc de mémoire, en créant des espaces pour les nouveaux éléments à stocker. Ceci est très inefficace si cela est fait à plusieurs reprises 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 le sera éventuellement, puis d'ajouter 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.]])
336
Stephen Simmons

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. (La fonction append aura le même problème.) Si vous voulez construire votre matrice une colonne à la fois, il peut être préférable de la conserver dans une liste jusqu'à la fin, puis de la convertir 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 tout élément itératif, aussi longtemps que Chaque item ayant le même nombre d'éléments.
Dans ce cas particulier (data est une 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é sous ce nom, ce qui peut entraîner des bogues.)

MODIFIER:

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

77
Greg Ball

Pour créer un tableau multidimensionnel vide dans NumPy (par exemple, un tableau 2D m*n pour stocker votre matrice), si 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 en construisant le tableau à chaque ajout), vous pouvez compresser à 0 la dimension à laquelle vous souhaitez ajouter: X = np.empty(shape=[0, n]).

De cette façon, vous pouvez utiliser par exemple (ici m = 5 dont nous supposons que nous ne savions pas 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.]]
36
Franck Dernoncourt

J'ai beaucoup étudié la question car j'avais besoin d'utiliser numpy.array comme jeu dans l'un de mes projets scolaires et que je devais être initialisé vide ... griffonner 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)

Par conséquent, vous pouvez directement initialiser un tableau np comme suit:

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

J'espère que ça aide.

21
Andrei Paga

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

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

6
Il-Bhima

Si vous ne connaissez absolument pas la taille finale du tableau, vous pouvez incrémenter la taille du tableau comme suit:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • Notez le 0 dans la première ligne.
  • numpy.append est une autre option. Il appelle numpy.concatenate.
3
cyborg

Vous pouvez l’appliquer pour construire tout type de tableau, comme des zéros:

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]
2
Ali G

Selon l'utilisation que vous en faites, vous devrez peut-être spécifier le type de données (voir 'type' ).

Par exemple, pour créer un tableau 2D de valeurs 8 bits (pouvant être utilisé comme image monochrome):

myarray = numpy.empty(shape=(H,W),dtype='u1')

Pour une image RVB, incluez le nombre de canaux de couleur dans la forme: shape=(H,W,3)

Vous pouvez également envisager d'initialiser à zéro avec numpy.zeros au lieu d'utiliser numpy.empty. Voir la note ici .

1
nobar

Je pense que vous voulez gérer la plupart du travail avec les listes, puis utiliser le résultat comme une matrice. Peut-être que c'est un moyen; 

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)
0
runo

Je pense que vous pouvez créer un tableau numpy vide comme:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

Ce format est utile lorsque vous souhaitez ajouter un tableau numpy à la boucle.

0
veeresh d