切片具有开始和结束索引列表的任意维度数组

时间:2016-09-09 06:58:15

标签: arrays python-2.7 numpy multidimensional-array

我需要复制3D数组的一部分。 我有副本开始和结束的索引。

例如2D数组:

[[2 2 3 4 5]
 [2 3 3 4 5]
 [2 3 4 4 5]
 [2 3 4 5 5]
 [2 3 4 5 6]]

起始索引,结束索引是:

mini = [2, 1]
maxi = [4, 3]

所以结果应该是:

  [[3 4 4]
   [3 4 5]]

我可以写:

result = matrix[mini[0]:maxi[0], mini[1]:maxi[1]]

有没有办法一般地做到这一点?对于3Dim或NDim阵列?

2 个答案:

答案 0 :(得分:2)

这里的技巧是实现索引语法的内幕。这样:

result = matrix[mini[0]:maxi[0], mini[1]:maxi[1]]

是python中的简写(不仅仅是numpy):

indices = slice(mini[0], maxi[0]), slice(mini[1], maxi[1])
result = matrix[indices]

所以我们只需要动态生成indices

lower = [2, 1, ...]
upper = [4, 3, ...]

indices = tuple(np.s_[l:u] for l, u in zip(lower, upper))
result = matrix_nd[indices]

np.s_[a:b]slice(a, b)的简写。在这里,我们构建一个包含与lowerupper

中的值一样多的切片的元组

答案 1 :(得分:0)

您要查找的是slice对象,请参阅示例:

matrix = np.random.rand(4,5)
mini = [2, 1]
maxi = [4, 3]
slices=[slice(b,e) for b, e in zip(mini,maxi)]
print(slices)
print(matrix[slices])
print(matrix[mini[0]:maxi[0], mini[1]:maxi[1]])