假设我有一个带有形状(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]]
使用三个列表是否有更简单的方法来切割此特定数组?
答案 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)]
这样至少可以更好一点,但我认为你在清晰度方面确实获得了很多。