8 votes

Convertir une liste de listes de longueurs différentes en un tableau numpy

J'ai une liste de listes avec des longueurs différentes (par exemple [[1, 2, 3], [4, 5], [6, 7, 8, 9]] ) et que vous voulez le convertir en un numpy tableau d'entiers. Je comprends que les "sous" tableaux dans numpy d'un tableau multidimensionnel doivent avoir la même longueur. Quelle est donc la manière la plus efficace de convertir une liste comme celle de l'exemple ci-dessus en un tableau multidimensionnel ? numpy comme ceci [[1, 2, 3, 0], [4, 5, 0, 0], [6, 7, 8, 9]] c'est-à-dire complété par des zéros ?

12voto

plasmon360 Points 2583

Vous pouvez créer un tableau numpy avec np.zeros et le remplir avec les éléments de votre liste comme indiqué ci-dessous.

a = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
import numpy as np
b = np.zeros([len(a),len(max(a,key = lambda x: len(x)))])
for i,j in enumerate(a):
    b[i][0:len(j)] = j

résulte en

[[ 1.  2.  3.  0.]
 [ 4.  5.  0.  0.]
 [ 6.  7.  8.  9.]]

12voto

hpaulj Points 6132

Voici un @Divakar type de réponse :

In [945]: ll = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
In [946]: lens = [len(l) for l in ll]      # only iteration
In [947]: lens
Out[947]: [3, 2, 4]
In [948]: maxlen=max(lens)
In [949]: arr = np.zeros((len(ll),maxlen),int)
In [950]: mask = np.arange(maxlen) < np.array(lens)[:,None] # key line
In [951]: mask
Out[951]: 
array([[ True,  True,  True, False],
       [ True,  True, False, False],
       [ True,  True,  True,  True]], dtype=bool)
In [952]: arr[mask] = np.concatenate(ll)    # fast 1d assignment
In [953]: arr
Out[953]: 
array([[1, 2, 3, 0],
       [4, 5, 0, 0],
       [6, 7, 8, 9]])

Pour les grandes listes, il peut être plus rapide. Mais il est plus difficile à comprendre et/ou à recréer.

Convertir une séquence Python en tableau NumPy, en remplissant les valeurs manquantes - a un bon poste par Divakar. itertools.zip_longest est également mentionné. Cela pourrait être cité comme un doublon.

6voto

Moses Koledoye Points 60613

Effectue un prétraitement de la liste, en remplissant les sous-listes les plus courtes, avant de la convertir en un tableau numpy :

>>> lst = [[1, 2, 3], [4, 5], [1, 7, 8, 9]]
>>> pad = len(max(lst, key=len))
>>> np.array([i + [0]*(pad-len(i)) for i in lst])
array([[1, 2, 3, 0],
       [4, 5, 0, 0],
       [1, 7, 8, 9]])

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