90 votes

Partitionner un tableau en N morceaux avec Numpy

Il y a ceci Comment diviser une liste en morceaux de taille égale ? pour diviser un tableau en morceaux. Existe-t-il un moyen de faire cela plus efficacement pour les tableaux géants en utilisant Numpy ?

134voto

Prashant Kumar Points 5220

Essayez numpy.array_split .

Dans la documentation :

>>> x = np.arange(8.0)
>>> np.array_split(x, 3)
    [array([ 0.,  1.,  2.]), array([ 3.,  4.,  5.]), array([ 6.,  7.])]

Identique à numpy.split mais ne lèvera pas d'exception si les groupes ne sont pas de même longueur.

Si le nombre de morceaux > len(array), vous obtenez des tableaux vides imbriqués à l'intérieur, pour résoudre ce problème - si votre tableau divisé est sauvegardé dans le fichier a alors vous pouvez supprimer les tableaux vides par :

[x for x in a if x.size > 0]

Il suffit de le sauvegarder dans a si vous le souhaitez.

24voto

Theodros Zelleke Points 5536

Quelques exemples d'utilisation de array_split , split , hsplit y vsplit :

n [9]: a = np.random.randint(0,10,[4,4])

In [10]: a
Out[10]: 
array([[2, 2, 7, 1],
       [5, 0, 3, 1],
       [2, 9, 8, 8],
       [5, 7, 7, 6]])

Quelques exemples d'utilisation array_split :
Si vous donnez un tableau ou une liste comme deuxième argument, vous donnez essentiellement les indices (avant) qui doivent être 'coupés'.

# split rows into 0|1 2|3
In [4]: np.array_split(a, [1,3])
Out[4]:                                                                                                                       
[array([[2, 2, 7, 1]]),                                                                                                       
 array([[5, 0, 3, 1],                                                                                                         
       [2, 9, 8, 8]]),                                                                                                        
 array([[5, 7, 7, 6]])]

# split columns into 0| 1 2 3
In [5]: np.array_split(a, [1], axis=1)                                                                                           
Out[5]:                                                                                                                       
[array([[2],                                                                                                                  
       [5],                                                                                                                   
       [2],                                                                                                                   
       [5]]),                                                                                                                 
 array([[2, 7, 1],                                                                                                            
       [0, 3, 1],
       [9, 8, 8],
       [7, 7, 6]])]

Un nombre entier comme seconde arg. spécifie le nombre de égal des morceaux :

In [6]: np.array_split(a, 2, axis=1)
Out[6]: 
[array([[2, 2],
       [5, 0],
       [2, 9],
       [5, 7]]),
 array([[7, 1],
       [3, 1],
       [8, 8],
       [7, 6]])]

split fonctionne de la même manière mais soulève une exception si un partage égal n'est pas possible.

En plus de array_split vous pouvez utiliser des raccourcis vsplit y hsplit .
vsplit y hsplit sont plutôt explicites :

In [11]: np.vsplit(a, 2)
Out[11]: 
[array([[2, 2, 7, 1],
       [5, 0, 3, 1]]),
 array([[2, 9, 8, 8],
       [5, 7, 7, 6]])]

In [12]: np.hsplit(a, 2)
Out[12]: 
[array([[2, 2],
       [5, 0],
       [2, 9],
       [5, 7]]),
 array([[7, 1],
       [3, 1],
       [8, 8],
       [7, 6]])]

10voto

mgilson Points 92954

Je crois que vous cherchez numpy.split ou éventuellement numpy.array_split si le nombre de sections ne doit pas diviser correctement la taille du tableau.

9voto

Jaime Points 25540

Pas tout à fait une réponse, mais un long commentaire avec un bon formatage du code vers les autres réponses (correctes). Si vous essayez ce qui suit, vous verrez que ce que vous obtenez sont des vues du tableau original, pas des copies, et ce n'était pas le cas pour la réponse acceptée dans la question que vous mettez en lien. Soyez conscient des effets secondaires possibles !

>>> x = np.arange(9.0)
>>> a,b,c = np.split(x, 3)
>>> a
array([ 0.,  1.,  2.])
>>> a[1] = 8
>>> a
array([ 0.,  8.,  2.])
>>> x
array([ 0.,  8.,  2.,  3.,  4.,  5.,  6.,  7.,  8.])
>>> def chunks(l, n):
...     """ Yield successive n-sized chunks from l.
...     """
...     for i in xrange(0, len(l), n):
...         yield l[i:i+n]
... 
>>> l = range(9)
>>> a,b,c = chunks(l, 3)
>>> a
[0, 1, 2]
>>> a[1] = 8
>>> a
[0, 8, 2]
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8]

0voto

Nilani Algiriyage Points 1128

Que pensez-vous de ça ? Ici, vous divisez le tableau en utilisant la longueur que vous voulez avoir.

a = np.random.randint(0,10,[4,4])

a
Out[27]: 
array([[1, 5, 8, 7],
       [3, 2, 4, 0],
       [7, 7, 6, 2],
       [7, 4, 3, 0]])

a[0:2,:]
Out[28]: 
array([[1, 5, 8, 7],
       [3, 2, 4, 0]])

a[2:4,:]
Out[29]: 
array([[7, 7, 6, 2],
       [7, 4, 3, 0]])

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