【问题标题】:Slice array of arbitrary dimension with lists of start and end indices具有开始和结束索引列表的任意维度切片数组
【发布时间】:2016-09-09 06:58:15
【问题描述】:

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

例如二维数组:

[[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 数组?

【问题讨论】:

  • 对不起,我不明白你的例子......这些指数如何给你这个结果?即你如何准确地索引“开始”和“结束”?

标签: arrays python-2.7 numpy multidimensional-array


【解决方案1】:

这里的诀窍是了解索引语法的本质。这个:

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 中的值一样多的切片的元组

【讨论】:

  • 谢谢。很有帮助的答案。
【解决方案2】:

您要查找的是 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]])

【讨论】:

  • 拜托,除了range(len(...))
  • @Eric 那里,已修复。
猜你喜欢
  • 2019-10-07
  • 2012-02-24
  • 2023-03-23
  • 2021-11-28
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多