小能豆

将二维数组转换为具有重叠步幅的三维数组

py

我将使用 NumPy 或本机函数将二维数组转换为带有前几行的三维数组。

输入:

[[1,2,3],
 [4,5,6],
 [7,8,9],
 [10,11,12],
 [13,14,15]]

输出:

[[[7,8,9],    [4,5,6],    [1,2,3]],
 [[10,11,12], [7,8,9],    [4,5,6]],
 [[13,14,15], [10,11,12], [7,8,9]]]

有人能帮忙吗?我在网上搜索了一段时间,但没有找到答案。


阅读 10

收藏
2024-11-15

共1个答案

小能豆

方法 #1

一种方法np.lib.stride_tricks.as_strided是将一个放入view输入2D数组中,这样就不会占用任何内存空间 -

L = 3  # window length for sliding along the first axis
s0,s1 = a.strides

shp = a.shape
out_shp = shp[0] - L + 1, L, shp[1]
strided = np.lib.stride_tricks.as_strided
out = strided(a[L-1:], shape=out_shp, strides=(s0,-s0,s1))

示例输入、输出 -

In [43]: a
Out[43]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15]])

In [44]: out
Out[44]: 
array([[[ 7,  8,  9],
        [ 4,  5,  6],
        [ 1,  2,  3]],

       [[10, 11, 12],
        [ 7,  8,  9],
        [ 4,  5,  6]],

       [[13, 14, 15],
        [10, 11, 12],
        [ 7,  8,  9]]])

方法 #2

broadcasting或者,生成所有行索引的方法更简单一些-

In [56]: a[range(L-1,-1,-1) + np.arange(shp[0]-L+1)[:,None]]
Out[56]: 
array([[[ 7,  8,  9],
        [ 4,  5,  6],
        [ 1,  2,  3]],

       [[10, 11, 12],
        [ 7,  8,  9],
        [ 4,  5,  6]],

       [[13, 14, 15],
        [10, 11, 12],
        [ 7,  8,  9]]])
2024-11-15