2017-10-20 8 views
2

Supposons que j'ai un réseau numpy de forme (10, 1000, 1000), et j'ai trois listes, qui sont supposées représenter la gamme des indices de chaque axe comme ceci:Numpy l'indexation de la matrice 3D en utilisant des listes

z_range = [0, 5] 
y_range = [200, 300] 
x_range = [300, 500] 

Je sais que je peux faire ce qui suit, mais il semble plutôt bavard:

arr[z_range[0]:z_range[1], y_range[0]:y_range[1], x_range[0]:x_range[1]] 

est-il un moyen plus facile à trancher ce tableau particulier en utilisant les trois listes?

Répondre

2

Je ne peux pas vraiment penser à un excellent moyen du haut de ma tête. Il pourrait y avoir une meilleure façon d'utiliser l'un des nombreux trucs d'indexation de Numpy. Le plus simple que je puisse penser est de créer manuellement des objets slice(). La syntaxe start:end se traduit en réalité directement aux objets slice(start, end). Ainsi, vous pouvez écrire:

arr[slice(*z_range), slice(*y_range), slice(*x_range)] 

donc c'est un moins un peu plus agréable, mais je ne pense pas que vous gagnez vraiment beaucoup en termes de clarté.

3

indexation prend un tuple, de sorte que vous pouvez simplement construire votre tuple dynamiquement, en utilisant une expression du générateur:

>>> z_range = [0, 3] 
>>> y_range = [2, 3] 
>>> x_range = [3, 5] 
>>> arr = numpy.arange(5*5*5).reshape(5,5,5) 
>>> arr[tuple(slice(a, b) for a,b in (x_range, y_range, z_range))] 
array([[[ 85, 86, 87]], 

     [[110, 111, 112]]])