【问题标题】:Extratcing all square submatrices from matrix using Numpy使用 Numpy 提取矩阵的所有方形子矩阵
【发布时间】:2015-09-04 12:45:29
【问题描述】:

假设我有一个 NxN numpy 矩阵。我正在寻找从该矩阵中提取所有方形块(子矩阵)的最快方法。表示 0 的原始矩阵的所有 CxC 部分。子矩阵应对应于原始矩阵的连续行/列索引。我想在尽可能短的时间内实现这一目标。

【问题讨论】:

  • 子矩阵是否应该对应于原始矩阵的连续行/列索引(例如行0, 1, 2和列0, 1, 2)或者它们可以是任意顺序(例如:行0, 4, 8和行0, 2, 1)?
  • 我已经更新了我的帖子来回答你的问题。

标签: python-2.7 numpy matrix submatrix


【解决方案1】:

你可以使用 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 中避免循环本身并不是一个目标。只要您注意它,就不应该有太多开销。

【讨论】:

    【解决方案2】:

    够棘手,但这里有一个提取 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()
    

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多