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 ?
Réponses
Trop de publicités?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.]]
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.
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]])