我正在尝试在Python中实现R函数embed
。它处理一维数组并创建一个矩阵,其列是原始数组的子系列,因此其长度为size - columns
。也许最好用一个例子来解释。
def embed(data, n):
return np.array([data[n-1::-1]] + [
data[k:i:-1] for i, k in zip(range(0, data.size - n), range(n, data.size))
])
>>> x = np.arange(10)
>>> y = embed(x, 3)
>>> y
array([[2, 1, 0],
[3, 2, 1],
[4, 3, 2],
[5, 4, 3],
[6, 5, 4],
[7, 6, 5],
[8, 7, 6],
[9, 8, 7]])
在这里,我逐行创建数据切片并将它们彼此堆叠。问题是,这非常效率很低。我有成千上万的数据点,所以此操作的时间是几秒钟,这是不可接受的。数组的内容不需要修改,它们会传递到sklearn
并复制。因此,我认为索引这些短片并使用np.array
复制整个内容会产生不必要的开销。
这似乎是一种已经实现的操作,或者至少可以使用更好的方法轻松构建的操作,但是至少embed
在搜索时不会产生任何结果。如何实现?
通过首先生成列并转置结果,可以消除大部分性能下降的问题:
def embed(data, n):
return np.array([
data[i:k+1] for i, k in zip(range(0, n), range(data.size - n, data.size))
][::-1]).T
还是,我想知道在numpy
中是否有更方便的方法来构造这样的数组。