【问题标题】:How to efficiently perform a grid search for a large matrix in Python?如何有效地在 Python 中对大矩阵执行网格搜索?
【发布时间】:2014-03-15 09:02:06
【问题描述】:

给定一个 nxn 矩阵 A(它实际上是图的邻接矩阵),我需要查看该矩阵的所有可能的 mxm 子矩阵(在本例中为 m =8),并将子矩阵传递给函数并收集其结果。

现在,我这样做如下:

# generate all possible 8x8 submatrices 
for w in itertools.combinations(range(n), m):
         # extract 8x8 submatrix from the matrix
         submatrix = A[np.ix_(list(w),list(w))]
         # do some work on the submatrix
         foo(submatrix)

问题是:上面的代码在 n=30x30 矩阵中运行良好(大约有 500 万个可能的 m=8x8 子矩阵需要搜索)。但是,我想将我的算法应用于最多 n=100x100 的矩阵,这意味着(100 选择 8)= 1860 亿个可能的子矩阵。

有什么可以让我更快地完成这个过程的吗?或者它是难以解决的难题?

【问题讨论】:

  • 对于“更快地执行此过程”,您是否希望将其矢量化,或者您是否正在寻找避免查看 1860 亿个窗口的解决方案?如果您需要第二件事,我们将需要更多详细信息。
  • 仔细想想,这听起来不像是 MxM 窗口。一个窗口通常不是连续的吗?
  • 您似乎正在尝试分析图形的所有大小为 8 的子图。在这种情况下,您不能使用连续窗口。根据您的任务,您也许可以应用图论来减少要完成的工作量,或者只是租用更多的计算机。
  • 是的,这非常困难。 foo 计算什么,你真正想知道你的图表什么?思考这个问题可能会对您有所帮助,但即便如此,您也很有可能遇到麻烦。图论中的许多图问题都非常困难。
  • 你需要认真问问自己是否总是需要全部 8 个 - 使用动态规划你可能能够重用 n 的第一个 m 的结果;这将大大加快整体处理速度。在这种情况下,您需要更聪明地工作,而不是更努力地工作 - 否则您将一事无成。

标签: python performance algorithm numpy matrix


【解决方案1】:
import numpy as np
from scipy.ndimage import generic_filter

m = np.arange(100*100).reshape((100,100))

def myfunction(data):
    mean = np.mean(data)
    return mean 

%timeit results = generic_filter(m, myfunction, size=8)
#10 loops, best of 3: 96.6 ms per loop

使用scipy.ndimage的generic_filter的解决方案

【讨论】:

  • OP 似乎使用了一个奇怪的窗口定义,所以不清楚这是否真的符合 OP 的要求。
  • 啊,是的,现在重新阅读问题。这可能不是他想要的。
  • 我编辑了这个问题。在我的例子中,“窗口”实际上是一个子矩阵。我正在研究一个邻接矩阵,并试图找到该大矩阵中可能存在的所有可能的子矩阵。不幸的是,放置一个连续的窗口并不能满足我的要求。
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2011-04-13
  • 2012-05-18
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多