我試圖使用從numpy.lib.stride_tricks
的功能從較大的二維數組中提取子序列,但我努力尋找寫出正確的東西爲strides
參數。沿着二維陣列的最後一個軸滑動窗口,使用NumPy步幅給出一個3D陣列
比方說,我有一個矩陣m
其中包含5個1D長度數組(a=
)10。我想提取長度(b=
)4的子一維數組中的每個m
1D陣列。
import numpy
from numpy.lib.stride_tricks import as_strided
a, b = 10, 4
m = numpy.array([range(i,i+a) for i in range(5)])
# first try
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b))
print sub_m.shape # (5,7,4) which is what i expected
print sub_m[-1,-1,-1] # Some unexpected strange number: 8227625857902995061
# second try with strides argument
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b), strides=(m.itemize,m.itemize,m.itemize))
# gives error, see below
AttributeError: 'numpy.ndarray' object has no attribute 'itemize'
正如你可以看到我成功拿到了sub_m
正確的形狀在我第一次嘗試。但是我無法找到如何在strides=()
寫信息:
m = [[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]]
預期輸出:
sub_n = [
[[0 1 2 3] [1 2 3 4] ... [5 6 7 8] [6 7 8 9]]
[[1 2 3 4] [2 3 4 5] ... [6 7 8 9] [7 8 9 10]]
[[2 3 4 5] [3 4 5 6] ... [7 8 9 10] [8 9 10 11]]
[[3 4 5 6] [4 5 6 7] ... [8 9 10 11] [9 10 11 12]]
[[4 5 6 7] [5 6 7 8] ... [9 10 11 12] [10 11 12 13]]
]
編輯:我有更多的數據,這就是爲什麼我要使用as_strided
(效率)
有什麼預期輸出的形狀?考慮輸入具有形狀(M,N),你必須說'L'的步幅。 – Divakar
預期輸出形狀:(5,7,4'-)(M,N,L),其中L = M-4 + 1 – Nuageux
也許你的意思(M,N-L + 1,L)? – Divakar