Python numpy,reshape / transform数组,避免遍历行

时间:2018-02-16 10:31:26

标签: python numpy

我有一个时间序列,每个步骤有4个功能,它看起来像一组有4列的行。我想转换它,所以行N将包含行N和N-1

的特征向量
a = np.array([[1,2,3,0], [4,5,6,0], [7,8,9,0], [10,11,12,0]])
array([[ 1,  2,  3,  0],
       [ 4,  5,  6,  0],
       [ 7,  8,  9,  0],
       [10, 11, 12,  0]])

a.shape
(4, 4)

转换为:

array([[[ 1,  2,  3,  0],
        [ 4,  5,  6,  0]],

       [[ 4,  5,  6,  0],
        [ 7,  8,  9,  0]],

       [[ 7,  8,  9,  0],
        [10, 11, 12,  0]]])
a_.shape
(3, 2, 4)

我使用以下代码执行此操作:

seq_len = 2
for i in range(seq_len, a.shape[0]+1):
    if i-seq_len == 0:
        a_ = a[i-seq_len:i, :].reshape(1, -1, 4)
    else:
        a_ = np.vstack([a_, a[i-seq_len:i, :].reshape(1, -1, 4)])

它正在运作,但我认为它不是最佳解决方案。您能否建议我如何通过避免“#”来改进我的代码?周期?

2 个答案:

答案 0 :(得分:8)

沿适当的轴使用足够的切片和np.stack

np.stack((a[:-1], a[1:]), axis=1)

与其他答案相比较的一些时间。

In [13]: s = 1_000_000

In [15]: a = np.arange(s).reshape((s//4,4))

In [21]: %timeit a[[(i-1,i) for i in range(1,a.shape[0])],:]
127 ms ± 724 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [22]: %timeit np.stack((a[:-1], a[1:]), axis=1)  # My solution
6.8 ms ± 8.18 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

避免任何python级for - 循环是可行的,OP是对的。

答案 1 :(得分:0)

使用切片:a[[(i-1,i) for i in range(1,a.shape[0])],:]

编辑:nicoco的回答是更好的。