使用列表

问题描述:

numpy的3D阵列索引假设我有具有形状(10,1000,1000)一numpy的阵列,并且我有三个列表,这是为了表示像这样各轴的索引的范围:使用列表

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

我知道我能做到以下几点,但似乎相当冗长:

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

有切片使用三个列表这个阵列更简单的方法?

我真的不能相信一个伟大的方式把我的头顶部。使用Numpy的各种索引技巧可能会有更好的方式。我能想到的最简单的方法是手动制作slice()对象。 start:end语法实际上直接转换为slice(start, end)对象。所以你可以写:

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

所以这至少有点更好,但我不认为你真的在清晰度方面获得很多。

索引需要一个元组,所以你可以构造你的元组动态,用生成器表达式:

>>> 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]]])