如你暗示,有一個與strides
In [900]: M = np.lib.stride_tricks.as_strided(A, shape=(2,2,3,3), strides=(16,4,16,4))
In [901]: M
Out[901]:
array([[[[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]],
[[ 2, 3, 4],
[ 6, 7, 8],
[10, 11, 12]]],
[[[ 5, 6, 7],
[ 9, 10, 11],
[13, 14, 15]],
[[ 6, 7, 8],
[10, 11, 12],
[14, 15, 16]]]])
In [902]: M.reshape(4,3,3) # to get it in form you list
Out[902]:
array([[[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]],
[[ 2, 3, 4],
[ 6, 7, 8],
[10, 11, 12]],
[[ 5, 6, 7],
[ 9, 10, 11],
[13, 14, 15]],
[[ 6, 7, 8],
[10, 11, 12],
[14, 15, 16]]])
這樣做與進步的問題的一種方式是,它是先進的,硬沒有太多numpy的經驗來解釋給別人。我沒有多少試驗和錯誤就想出了這張表格,但我在這裏呆了太久。 :))。
但這迭代求解更容易解釋:
In [909]: alist=[]
In [910]: for i in range(2):
...: for j in range(2):
...: alist.append(A[np.ix_(range(i,i+3),range(j,j+3))])
...:
In [911]: alist
Out[911]:
[array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]]),
array([[ 2, 3, 4],
[ 6, 7, 8],
[10, 11, 12]]),
array([[ 5, 6, 7],
[ 9, 10, 11],
[13, 14, 15]]),
array([[ 6, 7, 8],
[10, 11, 12],
[14, 15, 16]])]
哪些可以變成一個數組np.array(alist)
。如果它更清晰,使用這個沒什麼問題。
有一點要牢記有關as_strided
的做法是,它是一個視圖,並更改M
可能改變A
,並在M
在一個地方的改變可以M
修改的幾個地方。但是重塑M
可能會將其變成副本。因此總的來說,從M
讀取值並將其用於計算如sum
和mean
會更安全。就地改變可能是不可預測的。
迭代解決方案產生全部副本。
與np.ogrid
代替np.ix_
迭代溶液(否則相同的想法):
np.array([A[np.ogrid[i:i+3, j:j+3]] for i in range(2) for j in range(2)])
既ix_
和ogrid
只是簡單的方法構建對載體的用於索引的塊:
In [970]: np.ogrid[0:3, 0:3]
Out[970]:
[array([[0],
[1],
[2]]), array([[0, 1, 2]])]
同樣的事情,但與slice
對象:
np.array([A[slice(i,i+3), slice(j,j+3)] for i in range(2) for j in range(2)])
此列表版本與as_strided
解決方案(列表中的元素是視圖)具有相似的view
行爲。
對於使用非重疊塊6x6的,請嘗試:
In [1016]: np.array([A[slice(i,i+3), slice(j,j+3)] for i in range(0,6,3) for j i
...: n range(0,6,3)])
Out[1016]:
array([[[ 1, 2, 3],
[ 7, 8, 9],
[13, 14, 15]],
[[ 4, 5, 6],
[10, 11, 12],
[16, 17, 18]],
[[19, 20, 21],
[25, 26, 27],
[31, 32, 33]],
[[22, 23, 24],
[28, 29, 30],
[34, 35, 36]]])
假設你想連續的塊,內片/範圍沒有發生變化,只是步進爲外i
和j
In [1017]: np.arange(0,6,3)
Out[1017]: array([0, 3])
類似的問題可以用滾動窗口或滑動窗口來表達。有人甚至可能找到一個很好的副本。 – hpaulj