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)))
6 Réponses :
Utilisez ceci évite d'utiliser une autre option pourrait em> être à note cependant que cela provoquera réallocation quadratique . Quelque chose comme cela fonctionne beaucoup em> meilleur: p> sur ma machine I obtenez: p> Comme vous pouvez le constater, une accélération de 16x. Le un autre accélère 6x 6x. P> J'ai cherché une solution "pure-python", ne pas connaître NUMPY. Je crois que la solution d'Abhijit s> Unutbu / Senderle est la voie à suivre dans votre cas. P> p> chaîne.from_iterable code>
: * code> qui est assez coûteux à manipuler si le iérêteur a de nombreux sublistes. P>
somme code> les listes: p>
chaîne.from_iterable code> est encore plus rapide: p>
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])
Que diriez-vous d'essayer:
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
Le moyen le plus rapide de créer un tableau numpy à partir d'un itérateur consiste à utiliser Comme vous pouvez le constater, ceci est plus rapide que la conversion de une liste, et beaucoup plus rapide que numpy.fromiter code>:
htstack code>. p> p>
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)