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
range
de 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?