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 回答