Comment créer un tableau/matrice vide dans NumPy?
Je n'arrive pas à comprendre comment utiliser un tableau ou une matrice de la manière dont j'utiliserais normalement une liste. Je veux créer un tableau vide (ou une matrice), puis ajouter une colonne (ou une ligne) à la fois.
Pour le moment, la seule façon que je peux trouver pour le faire est comme:
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 ceci:
list = []
for item in data:
list.append(item)
Existe-t-il un moyen d'utiliser ce type de notation pour les tableaux ou les matrices NumPy?
9 réponses
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, le tableau entier doit être copié dans un nouveau bloc de mémoire, créant des espaces pour les nouveaux éléments à stocker. Ceci est très inefficace s'il est fait à plusieurs reprises pour construire un tableau.
Dans le cas de l'ajout de lignes, votre meilleur pari est de créer un tableau qui est aussi gros que votre ensemble de données sera finalement, puis ajouter les 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.]])
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, vous pourriez être mieux de le garder dans une liste que c'est fini, et seulement ensuite de le convertir en une tableau.
Par exemple
mylist = []
for item in data:
mylist.append(item)
mat = numpy.array(mylist)
item
peut être une liste, un tableau ou tout objet iterable, tant
comme chaque item
a le même nombre d'éléments.
Dans ce cas particulier (data
est-ce que les colonnes de la matrice sont itérables), 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 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!
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 (à savoir re-construire le tableau à chaque ajout), vous pouvez presser à 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 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.]]
J'ai beaucoup regardé cela parce que j'avais besoin d'utiliser un numpy.tableau comme un ensemble dans l'un de mes projets scolaires et je devais être initialisé vide... Je n'ai trouvé aucune réponse pertinente ici sur Stack Overflow, alors j'ai commencé à 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 cela aide.
Vous pouvez utiliser la fonction Ajouter. 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 (ex. inversion) sur la matrice/tableau chaque fois que vous y ajoutez quelque chose, je voudrais simplement créer une liste, y ajouter puis la convertir en un tableau.
Si vous absolument ne sais pas la taille du tableau, vous pouvez incrémenter la taille du tableau comme ceci:
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 appellenumpy.concatenate
.
Vous pouvez l'appliquer pour construire n'importe quel type de tableau, comme des zéros:
a = range(5)
a = [i*0 for i in a]
print a
[0, 0, 0, 0, 0]
Selon ce que vous utilisez ce pour, vous devrez peut-être spécifier le type de données (voir 'dtype').
Par exemple, pour créer un tableau 2D de valeurs 8 bits (utilisable 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 une initialisation zéro avec numpy.zeros
au lieu d'utiliser numpy.empty
. Voir la note ici.
Je pense que vous voulez traiter le travail avec des 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)