Python Numpy 向量化组合学的嵌套 for 循环

标签 python numpy matrix vectorization combinatorics

给定一个 nxn 数组 A 的实数正数,我试图找到二维数组三行的所有组合的元素最小值的最大值中的最小值。使用 for 循环,结果是这样的:

import numpy as np

n = 100
np.random.seed(2)
A = np.random.rand(n,n)
global_best = np.inf

for i in range(n-2):
    for j in range(i+1, n-1):
        for k in range(j+1, n):
            # find the maximum of the element-wise minimum of the three vectors
            local_best = np.amax(np.array([A[i,:], A[j,:], A[k,:]]).min(0))
            # if local_best is lower than global_best, update global_best
            if (local_best < global_best):
                global_best = local_best
                save_rows = [i, j, k]

print global_best, save_rows

n = 100 的情况下,输出应该是这样的:

Out[]: 0.492652949593 [6, 41, 58]

不过我有一种感觉,我可以使用 Numpy 向量化更快地完成这项工作,并且我当然会感谢任何帮助。谢谢。

最佳答案

此解决方案对于 n=100 快 5 倍:

coms = np.fromiter(itertools.combinations(np.arange(n), 3), 'i,i,i').view(('i', 3))
best = A[coms].min(1).max(1)
at = best.argmin()
global_best = best[at]
save_rows = coms[at]

第一行有点复杂,但将 itertools.combinations 的结果转换为 NumPy 数组,其中包含所有可能的 [i,j,k] 索引组合。

从那里开始,使用所有可能的索引组合索引到 A,然后沿适当的轴减少是一件简单的事情。

此解决方案在构建所有可能组合的具体数组 A[coms] 时会消耗更多内存。对于较小的 n,例如低于 250,它可以节省时间,但是对于较大的 n,内存流量会非常高,并且可能比原始代码慢。

关于Python Numpy 向量化组合学的嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49993101/

相关文章:

python - 使用索引和值将值添加到 Scipy 稀疏矩阵

python - 在python中创建数组X,其中包含数组Y中每个元素的一定数量的副本

scala - OpenCV 获取矩阵的形状

python - PyQt QPushButton 背景颜色

python - lxml 永远不会在 ubuntu 上完成构建

python - 使用 sqlalchemy 插入行后获取主键

python - GridseachCV - 值错误 : Found input variables with inconsistent numbers of samples: [33 1]

r - 在 R 中填充矩阵

r - R 中的错​​误 : non-conformable arrays

python - 在多个数据集上运行相同的测试