2

NxN numpy 行列があるとします。このマトリックスからすべての正方形のチャンク (サブマトリックス) を抽出する最速の方法を探しています。0 < C < N+1の元の行列のすべての CxC 部分を意味します。サブマトリックスは、元のマトリックスの連続する行/列のインデックスに対応する必要があります。できるだけ短い時間でこれを達成したい。

4

2 に答える 2

0

Numpy スライスを使用できます。

import numpy as np

n = 20
x = np.random.rand(n, n)

slice_list = [slice(k, l) for k in range(0, n) for l in range(k, n)]

results = [x[sl,sl] for sl in slice_list]

Numpy でループを回避すること自体は目標ではありません。あなたがそれに気をつけている限り、オーバーヘッドはあまりないはずです。

于 2015-06-18T19:47:56.820 に答える
0

非常にトリッキーですが、NxN 行列ですべての MxM サブ行列を抽出する例を次に示します。

import numpy as NP
import numpy.random as RNG

P = N - M + 1
x = NP.arange(P).repeat(M)
y = NP.tile(NP.arange(M), P) + x

a = RNG.randn(N, N)
b = a[NP.newaxis].repeat(P, axis=0)
c = b[x, y]
d = c.reshape(P, M, N)
e = d[:, NP.newaxis].repeat(P, axis=1)
f = e[:, x, :, y]
g = f.reshape(P, M, P, M)
h = g.transpose(2, 0, 3, 1)

for i in range(0, P):
    for j in range(0, P):
        assert NP.equal(h[i, j], a[i:i+M, j:j+M]).all()
于 2016-10-27T20:30:35.067 に答える