[英]Transform 2D array to a 3D array with overlapping strides
我會使用NumPy或本機函數將2d數組轉換為前一行的3d。
輸入:
[[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
方法,它為我們提供了輸入2D
數組的view
,因此不再占用內存空間 -
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]]])
列表理解怎么樣?
In [144]: np.array([l[i:i + 3][::-1] for i in range(0, len(l) - 2)])
Out[144]:
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]]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.