从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
笔记:
-
这不会检查索引超出范围的情况。我想很容易首先确保
idx不包含这些值。 -
Using
np.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.