【发布时间】:2018-04-22 21:33:27
【问题描述】:
我希望将Hungarian algorithm 应用于由列表的叉积row_ind、col_ind 索引的numpy 矩阵C 的许多子集。目前,我看到了以下选项:
-
双切片:
linear_sum_assignment(C[row_ind,:][:,col_ind])
问题:每个子集操作有两个副本。
-
通过
np.ix_进行高级切片:linear_sum_assignment(C[np.ix_(row_ind, col_ind)])
问题:每个子集一个副本,np.ix_ 效率低下(分配 n x n 矩阵)。
更新:正如@hpaulj 所述,np.ix_ 实际上不是分配 n x n 矩阵,但它仍然比 1 慢。
问题:不适用于linear_sum_assignment。
所以,没有一个选项是令人满意的。
理想的情况是能够使用矩阵C 指定子矩阵视图,并分别为行和列使用几个一维掩码,因此可以将这样的视图传递给linear_sum_assignment。对于另一个linear_sum_assignment 电话,我会快速调整掩码,但从不修改或复制/子集整个矩阵。
numpy 中是否已经有类似的东西可用?
处理同一大矩阵的多个子矩阵的最有效方法是什么(尽可能少的副本/内存分配)?
【问题讨论】:
-
匈牙利算法将在时间/复杂性方面轻松主导这个子集准备,对吧?
-
这里的
C是什么?我并不完全清楚C与匈牙利算法的输入之间的关系是什么。 -
更多关于匈牙利算法和 python 的信息在stackoverflow.com/questions/43162526/…(和链接)。掩蔽创建副本,而不是视图。为了显着改进
scipymunkres实现,我不得不在选定的步骤中使用cython(尤其是第一个非零搜索)。 -
@hpaulj 对于所有情况或特定情况?对于大型矩阵,scipy 的 IPM 应该会胜过它(至少我的 IPM 做到了;但它与 scipy 中使用的不同)。
-
最初我以为你是在尝试从头开始实现
munkres,因为(如scipy代码中所示),它有一个2d 成本矩阵和4 个1d 掩码数组。但在进一步阅读时,您似乎在更高层次上工作,掩盖了更大的矩阵。只要row_ind和col_ind是列表或数组,而不是切片,您就会将副本传递给scipy函数。
标签: numpy scipy hungarian-algorithm