NumPy中子序列的2D数组

时间:2019-03-09 22:19:03

标签: python arrays numpy slice

我正在尝试在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中是否有更方便的方法来构造这样的数组。

0 个答案:

没有答案