Considérons un tableau de la forme suivante (juste un exemple):
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]]
Sa forme est [9,2]. Maintenant, je veux transformer le tableau pour que chaque colonne devienne une forme [3,3], comme ceci:
[[ 0 6 12]
[ 2 8 14]
[ 4 10 16]]
[[ 1 7 13]
[ 3 9 15]
[ 5 11 17]]
La solution la plus évidente (et sûrement "non-Pythonic") consiste à initialiser un tableau de zéros avec la dimension appropriée et à exécuter deux boucles for où il sera rempli de données. Je suis intéressé par une solution qui est conforme au langage ...
a = np.arange(18).reshape(9,2)
b = a.reshape(3,3,2).swapaxes(0,2)
# a:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15],
[16, 17]])
# b:
array([[[ 0, 6, 12],
[ 2, 8, 14],
[ 4, 10, 16]],
[[ 1, 7, 13],
[ 3, 9, 15],
[ 5, 11, 17]]])
numpy a un excellent outil pour cette tâche ("numpy.reshape") lien vers la documentation de remodelage
a = [[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]]
`numpy.reshape(a,(3,3))`
vous pouvez aussi utiliser l'astuce "-1"
`a = a.reshape(-1,3)`
le "-1" est un caractère générique qui laissera l'algorithme numpy décider du nombre à saisir lorsque la deuxième dimension est 3
alors oui .. cela fonctionnerait aussi: a = a.reshape(3,-1)
et ceci: a = a.reshape(-1,2)
ne ferait rien
et ceci: a = a.reshape(-1,9)
changerait la forme en (2,9)
Il y a deux réarrangements possibles des résultats (exemple suivant avec @ eumiro ). Le paquet Einops
fournit une notation puissante pour décrire de telles opérations de manière non ambiguë
>> a = np.arange(18).reshape(9,2)
# this version corresponds to eumiro's answer
>> einops.rearrange(a, '(x y) z -> z y x', x=3)
array([[[ 0, 6, 12],
[ 2, 8, 14],
[ 4, 10, 16]],
[[ 1, 7, 13],
[ 3, 9, 15],
[ 5, 11, 17]]])
# this has the same shape, but order of elements is different (note that each paer was trasnposed)
>> einops.rearrange(a, '(x y) z -> z x y', x=3)
array([[[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]],
[[ 1, 3, 5],
[ 7, 9, 11],
[13, 15, 17]]])