5 votes

Découpage de la matrice python en quadrants

Supposons que j'ai la matrice suivante en python :

[[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]

Je veux le découper dans les matrices (ou quadrants/coins) suivantes :

[[1,2], [5,6]]

[[3,4], [7,8]]

[[9,10], [13,14]]

[[11,12], [15,16]]

Cela est-il possible avec les opérateurs de découpage standard de Python ou est-il nécessaire d'utiliser une bibliothèque étendue comme numpy ?

10voto

Nathan Villaescusa Points 6750

Si vous travaillez toujours avec une matrice 4x4 :

a = [[1 ,2 , 3, 4],
     [5 ,6 , 7, 8],
     [9 ,10,11,12],
     [13,14,15,16]]

top_left =  [a[0][:2], a[1][:2]]
top_right = [a[0][2:], a[1][2:]]
bot_left =  [a[2][:2], a[3][:2]]
bot_right = [a[2][2:], a[3][2:]]

Vous pourriez également faire la même chose pour une matrice de taille arbitraire :

h = len(a)
w = len(a[1])
top_left =  [a[i][:w // 2] for i in range(h // 2)]
top_right = [a[i][w // 2:] for i in range(h // 2)]
bot_left =  [a[i][:w // 2] for i in range(h // 2, h)]
bot_right = [a[i][w // 2:] for i in range(h // 2, h)]

1voto

gv12 Points 11

La question a déjà reçu une réponse, mais je pense que cette solution est plus générale. Elle peut également être utilisée numpy.split et la compréhension des listes de la manière suivante :

import numpy as np
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
B = [M for SubA in np.split(A,2, axis = 0) for M in np.split(SubA,2, axis = 1)]

J'y vais :

>>>[array([[1, 2],[5, 6]]), 
array([[3, 4],[7, 8]]), 
array([[ 9, 10],[13, 14]]),
array([[11, 12],[15, 16]])]

Maintenant, si vous voulez qu'ils soient assignés dans des variables différentes, il suffit de :

C1,C2,C3,C4 = B

Jetez un coup d'œil à doc numpy.split . Modification du paramètre indices_or_sections vous pouvez obtenir un plus grand nombre de splits.

0voto

Asterisk Points 1646
>>> a = [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]
>>> x = map(lambda x:x[:2], a)
>>> x
[[1, 2], [5, 6], [9, 10], [13, 14]]
>>> y = map(lambda x: x[2:], a)
>>> y
[[3, 4], [7, 8], [11, 12], [15, 16]]
>>> x[:2] + y[:2] + x[2:] + y[2:]
[[1, 2], [5, 6], [3, 4], [7, 8], [9, 10], [13, 14], [11, 12], [15, 16]]

0voto

Bien que les réponses puissent fournir la solution requise. Ces réponses sont pas applicable pour les tableaux de différentes tailles. Si vous avez un tableau NumPy de taille (6x7), alors ces méthodes ne créeront pas de solution. J'ai préparé une solution pour moi-même et je veux la partager ici.

Remarque : dans ma solution, il y aura des chevauchements en raison des différentes tailles d'axes. J'ai créé cette solution pour diviser une image astronomique en quatre quadrants. J'utilise ensuite ces quadrants pour calculer la moyenne et la médiane dans un anneau.

import numpy as np
def quadrant_split2d(array):
    """Example function for identifiying the elements of quadrants in an array.
    array: 
        A 2D NumPy array.
    Returns:
        The quadrants. True for the members of the quadrants, False otherwise.
    """
    Ysize = array.shape[0]
    Xsize = array.shape[1]
    y, x = np.indices((Ysize,Xsize))
    if not (Xsize==Ysize)&(Xsize % 2 == 0): print ('There will be overlaps')
    sector1=(x<Xsize/2)&(y<Ysize/2)
    sector2=(x>Xsize/2-1)&(y<Ysize/2)
    sector3=(x<Xsize/2)&(y>Ysize/2-1)
    sector4=(x>Xsize/2-1)&(y>Ysize/2-1)
    sectors=(sector1,sector2,sector3,sector4)
    return sectors

Vous pouvez tester la fonction avec les différents types de tableaux. Par exemple :

test = np.arange(42).reshape(6,7)
print ('Original array:\n', test)
sectors = quadrant_split2d(test)
print ('Sectors:')
for ss in sectors: print (test[ss])

Cela nous donnera les secteurs suivants :

[ 0  1  2  3  7  8  9 10 14 15 16 17]
[ 3  4  5  6 10 11 12 13 17 18 19 20]
[21 22 23 24 28 29 30 31 35 36 37 38]
[24 25 26 27 31 32 33 34 38 39 40 41]

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