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

我有一个数据矩阵,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)

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

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

回答

(感谢@MadPhysicist 的建议)

这应该有效:

a[idx.reshape(-1, 1) + np.arange(10)]

输出:
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()可能会有完全不同的性能。特性/缩放特性。

  • Also, you really don't need to reshape and transpose. The output array is the shape of the index. `idx.reshape(-1, 1) + np.arange(10)` is sufficient
  • We can see edits in the edit history. No need to mark "edit" and "update" in questions and answers. It's a common misconception among beginning authors that people want to see anything besides your polished product.

以上是从numpy数组中采样固定长度的序列的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>