2017-10-01 2 views
0

suite de code utilise la méthode 'de generic_filter', à partir de ndimage (scipy module de python), pour calculer des moyens pour une matrice de sous-éléments de 3x3; considérer chaque élément de la matrice comme un élément central (et l'exclure) et éviter les effets de frontière.Comment accéder à des valeurs individuelles utilisées par ndimage.generic_filter (module scipy)

import numpy as np 
from scipy import ndimage 

a = np.reshape(np.arange(25),(5,5)) 
print a 

matrix = np.array(a).astype(np.float) 

mask = np.ones((3, 3)) 
mask[1, 1] = 0 

result = ndimage.generic_filter(matrix, np.nanmean, footprint = mask, mode='constant', cval=np.NaN) 

print result 

résultat est imprimé comme suit:

[[ 0 1 2 3 4] 
[ 5 6 7 8 9] 
[10 11 12 13 14] 
[15 16 17 18 19] 
[20 21 22 23 24]] 
[[ 4.   4.   5.   6.   6.66666667] 
[ 5.6   6.   7.   8.   8.4  ] 
[ 10.6   11.   12.   13.   13.4  ] 
[ 15.6   16.   17.   18.   18.4  ] 
[ 17.33333333 18.   19.   20.   20.  ]] 

et il pourrait être corroboré ce qu 'il fonctionne comme prévu [premier moyen est de (5 + 6 + 1)/3 = 4, le deuxième moyen est (0 + 6 + 5 + 7 + 2)/5 = 4; et ainsi de suite].

Ma question est de savoir comment puis-je accéder aux valeurs individuelles (matrice) sous utilisés par ndimage.generic_filter pour calculer chaque np.nanmean?

Répondre

1

ndimage.generic_filter appelle une fonction une fois pour chaque sous-groupe. Vous spécifiez la fonction en tant que deuxième argument. Donc, si vous changez np.nanmean en une fonction personnalisée func (voir ci-dessous) alors vous pouvez avoir accès aux sous-matrices de func.

Pour accumuler une liste des sous-réseaux, qui pourraient être accessibles après l'appel à ndimage.generic_filter, vous pouvez passer à une liste func comme un argument supplémentaire et ajouter les sous-tableaux à la liste à l'intérieur func. Vous pouvez accéder à cette liste (et son contenu) après:

import numpy as np 
from scipy import ndimage 

def func(x, subarrays): 
    print(x) 
    subarrays.append(x) 
    return np.nanmean(x) 

a = np.reshape(np.arange(25),(5,5)) 
matrix = np.array(a).astype(np.float) 
mask = np.ones((3, 3)) 
mask[1, 1] = 0 
subarrays = [] 
result = ndimage.generic_filter(matrix, func, footprint = mask, 
           mode='constant', cval=np.NaN, 
           extra_arguments=(subarrays,)) 

print(result) 
print(len(subarrays)) 

imprime chaque sous-tableau:

[ nan nan nan nan 1. nan 5. 6.] 
[ nan nan nan 0. 2. 5. 6. 7.] 
[ nan nan nan 1. 3. 6. 7. 8.] 
[ nan nan nan 2. 4. 7. 8. 9.] 
[ nan nan nan 3. nan 8. 9. nan] 
[ nan 0. 1. nan 6. nan 10. 11.] 
[ 0. 1. 2. 5. 7. 10. 11. 12.] 
[ 1. 2. 3. 6. 8. 11. 12. 13.] 
[ 2. 3. 4. 7. 9. 12. 13. 14.] 
[ 3. 4. nan 8. nan 13. 14. nan] 
[ nan 5. 6. nan 11. nan 15. 16.] 
[ 5. 6. 7. 10. 12. 15. 16. 17.] 
[ 6. 7. 8. 11. 13. 16. 17. 18.] 
[ 7. 8. 9. 12. 14. 17. 18. 19.] 
[ 8. 9. nan 13. nan 18. 19. nan] 
[ nan 10. 11. nan 16. nan 20. 21.] 
[ 10. 11. 12. 15. 17. 20. 21. 22.] 
[ 11. 12. 13. 16. 18. 21. 22. 23.] 
[ 12. 13. 14. 17. 19. 22. 23. 24.] 
[ 13. 14. nan 18. nan 23. 24. nan] 
[ nan 15. 16. nan 21. nan nan nan] 
[ 15. 16. 17. 20. 22. nan nan nan] 
[ 16. 17. 18. 21. 23. nan nan nan] 
[ 17. 18. 19. 22. 24. nan nan nan] 
[ 18. 19. nan 23. nan nan nan nan] 

et imprime la finale result:

[[ 4.   4.   5.   6.   6.66666667] 
[ 5.6   6.   7.   8.   8.4  ] 
[ 10.6   11.   12.   13.   13.4  ] 
[ 15.6   16.   17.   18.   18.4  ] 
[ 17.33333333 18.   19.   20.   20.  ]] 

et la longueur de subarrays:

25 
+0

Je pourrais utiliser des valeurs individuelles (x) en dehors de ** func ** en les imprimant dans un fichier texte de disque. Est-il possible de les imprimer dans une variable pour les utiliser directement dans le code? (ou dois-je poser une autre question?) – xunilk

+0

Vous pouvez les ajouter à une liste. J'ai mis à jour le code pour montrer ce que je veux dire. – unutbu

+0

Merci beaucoup. Cela fonctionne parfaitement. – xunilk