使用列表
问题描述:
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]]])