J'ai un tableau NumPy comme suit:
[[[ 6. 7. 8. 9. 10.] [ 1. 2. 3. 4. 5.]] [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]] [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]]] [[[ 6. 7. 8. 9. 10.] [ 1. 2. 3. 4. 5.]] [[11. 12. 13. 14. 15.] [ 6. 7. 8. 9. 10.]] [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]]] [[[ 6. 7. 8. 9. 10.] [ 1. 2. 3. 4. 5.]] [[11. 12. 13. 14. 15.] [ 6. 7. 8. 9. 10.]] [[16. 17. 18. 19. 20.] [11. 12. 13. 14. 15.]]]
Je cherche à organiser de telle sorte qu'il ressemble à ceci:
x=np.zeros([3,2,5])
for i in range(len(arr)):
x[i]=arr[i:i+2,:][::-1]
Donc essentiellement un tableau 3D avec 2x5 dans chaque ligne du tableau. Le code que j'ai essayé est:
[[[6,7,8,9,10], [1,2,3,4,5]], [[11,12,13,14,15], [6,7,8,9,10]], [[16,17,18,19,20], [11,12,13,14,15]]]
Mais cela donne le résultat ci-dessous:
arr = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]])
3 Réponses :
Pas besoin d'utiliser de boucles. Le découpage suffit:
x = np.zeros([3,2,5], dtype=int) x[:,0] = arr[-3:,:] x[:,1] = arr[:3,:]
Essentiellement, vous attribuez la 0-ème ligne de toutes les pages aux 3 dernières lignes de arr et la 1ère ligne de toutes les pages à la première 3 lignes de arr.
Nous pouvons tirer parti de np.lib.stride_tricks. as_strided basé sur scikit-image's view_as_windows pour obtenir des fenêtres coulissantes. Plus d'informations sur l'utilisation de as_strided basé sur view_as_windows .
In [15]: from skimage.util.shape import view_as_windows
In [16]: view_as_windows(arr,(2,arr.shape[1]))[:,0,::-1]
Out[16]:
array([[[ 6, 7, 8, 9, 10],
[ 1, 2, 3, 4, 5]],
[[11, 12, 13, 14, 15],
[ 6, 7, 8, 9, 10]],
[[16, 17, 18, 19, 20],
[11, 12, 13, 14, 15]]])
Ce serait simplement une vue dans le tableau d'entrée. Par conséquent, il n'y a aucune surcharge de mémoire supplémentaire et une durée d'exécution pratiquement gratuite. Si vous voulez une sortie avec son propre espace mémoire, ajoutez-y .copy () , c'est-à-dire x.copy().
Exemple d'exécution -
from skimage.util.shape import view_as_windows x = view_as_windows(arr,(2,arr.shape[1]))[:,0,::-1]
Lorsque j'essaie d'exécuter votre tentative de code, j'obtiens une erreur, comme je m'y attendais. Si je change la
rangede la boucle enrange (x.shape [0])(c'est-à-direrange (len (x))), j'obtiens le résultat que vous voulez. Êtes-vous sûr que le tableau que vous avez collé provient de l'entrée et du code ci-dessus?