あなたがヒントとして、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の経験のない人に説明するための高度な、ハードであるということです。私は多くの試行錯誤がなくフォームを見つけましたが、私はここであまりにも長くぶら下がっています。 :))。
しかし、この反復解法を説明するのは簡単です:np.array(alist)
の配列に変換することができます
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]])]
。より明確な場合は、これを使用することで何も問題はありません。 as_strided
アプローチについて心に留めておくべき
ことの一つは、それが図であり、M
への変更はA
を変更することができ、かつM
内の1つの場所に変更がM
でいくつかの場所を変更することです。しかし、M
を再構成すると、それをコピーにすることができます。だから全体としてM
から値を読んで、sum
とmean
のような計算に使う方が安全です。適切な場所での変更は予測できません。
反復解は、すべての周りにコピーを生成します。
np.ogrid
代わりにnp.ix_
有する反復溶液(そうでなければ同じ考え方):
In [970]: np.ogrid[0:3, 0:3]
Out[970]:
[array([[0],
[1],
[2]]), array([[0, 1, 2]])]
:
np.array([A[np.ogrid[i:i+3, j:j+3]] for i in range(2) for j in range(2)])
両方ix_
とogrid
ブロックにインデックスを付けるためのベクターの対を構成するだけの簡単な方法であります
slice
オブジェクトの場合と同じことですが、
これのリストバージョンは、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