从 numpy 数组中采样固定长度的序列

lea*_*ner 7 python arrays numpy list python-3.x

我有一个数据矩阵,a并且我有存储在 array 中的索引列表idx。我想从idx. 现在我使用for循环来实现这一点。但它非常慢,因为我必须在迭代中提取大约 1000 次数据。下面是一个最小的工作示例。

import numpy as np
a = np.random.random(1000)
idx = np.array([1, 5, 89, 54])

# I want "data" array to have np.array([a[1:11], a[5:15], a[89:99], a[54:64]])
# I use for loop below but it is slow
data = []

for id in idx:
    data.append(a[id:id+10])  
data = np.array(data)

Run Code Online (Sandbox Code Playgroud)

有没有办法加快这个过程?谢谢。

编辑:我的问题与这里提出的问题不同。在问题中,与我的问题中的固定块大小相比,块的大小是随机的。存在其他差异。我不必用完整个数组a,一个元素可以出现在多个块中。我的问题不一定“拆分”数组。

fou*_*ead 7

(感谢@MadPhysicist 的建议)

这应该有效:

a[idx.reshape(-1, 1) + np.arange(10)]
Run Code Online (Sandbox Code Playgroud)

输出: Shape (L,10),其中L是长度idx

笔记:

  1. 这不会检查索引超出范围的情况。我想很容易首先确保idx不包含这些值。

  2. Usingnp.take(a, idx.reshape(-1, 1) + np.arange(10), mode='wrap')是一种替代方法,它将通过将它们包装在a. 传递mode='clip'而不是mode='wrap'将过多的索引剪辑到 的最后一个索引a。但是,np.take()可能会有完全不同的性能。特性/缩放特性。

  • 此外,您确实不需要重塑和转置。输出数组是索引的形状。`idx.​​reshape(-1, 1) + np.arange(10)` 就足够了 (5认同)
  • 我们可以在编辑历史中看到编辑内容。无需在问题和答案中标记“编辑”和“更新”。新手作者普遍存在一个误解,认为人们除了精美的产品之外还想看到任何东西。 (2认同)