web-dev-qa-db-fra.com

façon correcte et efficace d'aplatir le tableau en numpy en python?

J'ai:

a = array([[1,2,3],[4,5,6]])

et je voudrais l'aplatir, en joignant les deux listes internes en une seule entrée de tableau plat. Je peux faire:

array(list(flatten(a)))

mais cela semble inefficace en raison de la liste de distribution (je veux me retrouver avec un tableau et non un générateur.)

En outre, comment cela peut-il être généralisé à un tableau comme celui-ci:

b = array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])

où le résultat devrait être:

b = array([[1,2,3,4,5,6],
           [10,11,12,13,14,15]])

existe-t-il des opérateurs numpy/scipy intégrés/efficaces pour cela? Merci.

26
user248237

Vous pouvez utiliser la méthode reshape .

>>> import numpy
>>> b = numpy.array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])
>>> b.reshape([2, 6])
array([[ 1,  2,  3,  4,  5,  6],
       [10, 11, 12, 13, 14, 15]])
17
Matteo Italia

Vous devrez peut-être vérifier numpy.flatten et numpy.ravel, les deux renvoient un tableau 1-d à partir d'un tableau n-d.

De plus, si vous n'allez pas modifier le tableau 1-d retourné, je vous suggère d'utiliser numpy.ravel, car il ne fait pas de copie du tableau, mais renvoie simplement une vue du tableau, ce qui est beaucoup plus rapide que numpy.flatten.

>>>a = np.arange(10000).reshape((100,100))

>>>%timeit a.flatten()
100000 loops, best of 3: 4.02 µs per loop

>>>%timeit a.ravel()
1000000 loops, best of 3: 412 ns per loop

Consultez également cette post .

28
Alcott

Que diriez-vous:

>>> import numpy as np
>>> a=np.arange(1,7).reshape((2,3))
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> a.flatten()
array([1, 2, 3, 4, 5, 6])

et

>>> import numpy as np
>>> b=np.arange(1,13).reshape((2,2,3))
>>> b
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
>>> b.reshape((2,6))
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])
9
Mark Tolonen