使用列表的Numpy 3D数组索引

时间:2017-10-20 19:40:30

标签: python arrays numpy indexing

假设我有一个带有形状(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]]

使用三个列表是否有更简单的方法来切割此特定数组?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

我无法想到一个很好的方法。使用Numpy的各种索引技巧可能有更好的方法。我能想到的最简单的方法是手动制作slice()个对象。 start:end语法实际上直接转换为slice(start, end)个对象。所以你可以写:

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

这样至少可以更好一点,但我认为你在清晰度方面确实获得了很多。