我需要复制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阵列?
答案 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)
的简写。在这里,我们构建一个包含与lower
和upper
答案 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]])