(厳密には 2 次元の) numpy 配列内の重複しない連続した部分行列を調べる必要があるアルゴリズムを実装しています。たとえば、12 x 12 の場合
>>> a = np.random.randint(20, size=(12, 12)); a
array([[ 4, 0, 12, 14, 3, 8, 14, 12, 11, 18, 6, 6],
[15, 13, 2, 18, 15, 15, 16, 2, 9, 16, 6, 4],
[18, 18, 3, 8, 1, 15, 14, 13, 13, 13, 7, 0],
[ 1, 9, 3, 6, 0, 4, 3, 15, 0, 9, 11, 12],
[ 5, 15, 5, 6, 4, 4, 18, 13, 10, 17, 11, 8],
[13, 17, 8, 15, 17, 12, 7, 1, 13, 15, 0, 18],
[ 2, 1, 11, 12, 3, 16, 11, 9, 10, 15, 4, 16],
[19, 11, 10, 7, 10, 19, 7, 13, 11, 9, 17, 8],
[14, 14, 17, 0, 0, 0, 11, 1, 10, 14, 2, 7],
[ 6, 15, 6, 7, 15, 19, 2, 4, 6, 16, 0, 3],
[ 5, 10, 7, 5, 0, 8, 5, 8, 9, 14, 4, 3],
[17, 2, 0, 3, 15, 10, 14, 1, 0, 7, 16, 2]])
3x3 サブマトリックスを見て、最初の 3x3 サブマトリックスを左上隅に配置したいと思います。
>>> a[0:3, 0:3]
array([[ 4, 0, 12],
[15, 13, 2],
[18, 18, 3]])
などによって与えられる次のアロングa[0:3, 3:6]
。各行または列の最後のそのような一連のインデックスが配列の末尾からはみ出すかどうかは問題ではありません。存在するスライス内の部分を単に与えるという numpy の動作で十分です。
任意のサイズの行列と部分行列に対して、これらのスライス インデックスをプログラムで生成する方法が必要です。私は現在これを持っています:
size = 3
x_max = a.shape[0]
xcoords = range(0, x_max, size)
xcoords = zip(xcoords, xcoords[1:])
同様に、 を生成するy_coords
ため、一連のインデックスは で与えられitertools.product(xcoords, ycoords)
ます。
私の質問は次のとおりです。これを行うためのより直接的な方法はありnumpy.mgrid
ますか?