我有一个时间序列,每个步骤有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)])
它正在运作,但我认为它不是最佳解决方案。您能否建议我如何通过避免“#”来改进我的代码?周期?
答案 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的回答是更好的。