我将使用 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]]]
有人能帮忙吗?我在网上搜索了一段时间,但没有找到答案。
方法 #1
一种方法np.lib.stride_tricks.as_strided是将一个放入view输入2D数组中,这样就不会占用任何内存空间 -
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或者,生成所有行索引的方法更简单一些-
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]]])