11
votes

Aplatir une liste imbriquée de sublistes de taille variable dans un tableau scipe

Comment puis-je utiliser NUMPY / SICPY pour aplatir une liste imbriquée avec des sublistes de différentes tailles? La vitesse est très importante et les listes sont grandes.

 vec = sp.array(list(*chain(lst)))


0 commentaires

6 Réponses :


1
votes

Utilisez chaîne.from_iterable : xxx

ceci évite d'utiliser * qui est assez coûteux à manipuler si le iérêteur a de nombreux sublistes.

une autre option pourrait être à somme les listes: xxx

note cependant que cela provoquera réallocation quadratique . Quelque chose comme cela fonctionne beaucoup meilleur: xxx

sur ma machine I obtenez: xxx

Comme vous pouvez le constater, une accélération de 16x. Le chaîne.from_iterable est encore plus rapide: xxx

un autre accélère 6x 6x.


J'ai cherché une solution "pure-python", ne pas connaître NUMPY. Je crois que la solution d'Abhijit Unutbu / Senderle est la voie à suivre dans votre cas.


0 commentaires

8
votes

Vous pouvez essayer Numpy.hstack

>>> lst = [[1, 2, 3, 4],[2, 3],[1, 2, 3, 4, 5],[4, 1, 2]]
>>> np.hstack(lst)
array([1, 2, 3, 4, 2, 3, 1, 2, 3, 4, 5, 4, 1, 2])


0 commentaires

3
votes

Que diriez-vous d'essayer: xxx


0 commentaires

13
votes

Que diriez-vous de np.fromiter :

In [49]: %timeit np.hstack(lst*1000)
10 loops, best of 3: 25.2 ms per loop

In [50]: %timeit np.array(list(chain.from_iterable(lst*1000)))
1000 loops, best of 3: 1.81 ms per loop

In [52]: %timeit np.fromiter(chain.from_iterable(lst*1000), dtype='int')
1000 loops, best of 3: 1 ms per loop


0 commentaires

6
votes

Le moyen le plus rapide de créer un tableau numpy à partir d'un itérateur consiste à utiliser numpy.fromiter : xxx

Comme vous pouvez le constater, ceci est plus rapide que la conversion de une liste, et beaucoup plus rapide que htstack .


0 commentaires

0
votes

Utilisez une fonction pour aplatir la liste

>>> flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]
>>> flatten(lst)


0 commentaires