【问题标题】:Efficient way to slice a 2D array and skip indices; extract small segments repeatedly切片二维数组和跳过索引的有效方法;重复提取小片段
【发布时间】:2020-02-07 17:19:24
【问题描述】:

我有一个二维 numpy 数组 D,它的维度为 (1000, 800)。我想从数组中提取长度为 20 的小段:

假设 D[0][:] 是 [1, 2, 3, 4, 5, 6, ...] 并且我想要长度为 3 的段,我想要前三个数字 (1, 2, 3),然后跳过一些索引(比如 60),提取 3,跳过 60,依此类推。

我知道我可以做 D[:,start:end:step],但是有没有类似 D[:,start:end:step*:skip*] 的东西?

理想情况下,我想要这样的东西:

D = np.random.random((1000,800))
parts = D[:,0:20:1:skip_n_indices_and_repeat]

感谢您的宝贵时间和回答。如果您有更简单或不同的解决方案,请提出。谢谢。

【问题讨论】:

  • 我猜你的例子太复杂了,因为你可以将它最小化,给出一个一维数组的最小工作示例
  • 这就是as_strided 的用途:docs.scipy.org/doc/numpy/reference/generated/… 或者您可以尝试重新调整数组的形状,使感兴趣的元素放置在特定的轴上。例如,假设您有一个一维数组,您可以将其重塑为 (:, 10) 以获得 10 的步幅,然后提取前三列以便每 10 个元素获得三个元素。
  • 如果跳过是 3 的倍数,您可以将 D 重塑为 (1000, -1, 3)(在这种情况下,您必须先切掉最后几列),然后您可以使用切片[:, ::20](或[::21],如果你想跳过60个值而不计算三个选择的值),然后重新整形回(1000, -1)(在这种情况下它会形成(1000, 15))。

标签: python arrays numpy slice


【解决方案1】:

在不使用任何特殊方法的情况下,可以生成所需的索引掩码,如下所示:

D = np.random.random((1000,800))
step = 3
skip = 60
idx = np.arange(800)
needed_indexes = idx%(skip+step)<step

然后您可以以标准方式返回数组的副本:

>>> E = D[:,needed_indexes]
>>> E.shape
(1000, 39)

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2018-05-06
    • 2015-10-23
    • 2021-04-25
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多