Python 赋值问题,一个NumPy函数?

Python 赋值问题,一个NumPy函数?,python,numpy,optimization,scipy,combinatorics,Python,Numpy,Optimization,Scipy,Combinatorics,由于一个矩阵可以用单个矩阵的形式表示,我想知道NumPy是否有一个函数来求解这样一个矩阵。到目前为止,我还没有找到。也许你们当中有人知道NumPy/SciPy是否有分配问题解决功能 编辑:与此同时,我在上找到了一个Python(而不是NumPy/SciPy)实现。不过,我认为NumPy/SciPy实现可能要快得多,对吧?不,NumPy不包含这样的函数。组合优化超出了NumPy的范围。也许可以使用scipy.optimize中的一个优化器来完成,但我感觉约束的形式可能不正确 可能还包括分配问题的算

由于一个矩阵可以用单个矩阵的形式表示,我想知道NumPy是否有一个函数来求解这样一个矩阵。到目前为止,我还没有找到。也许你们当中有人知道NumPy/SciPy是否有分配问题解决功能


编辑:与此同时,我在上找到了一个Python(而不是NumPy/SciPy)实现。不过,我认为NumPy/SciPy实现可能要快得多,对吧?

不,NumPy不包含这样的函数。组合优化超出了NumPy的范围。也许可以使用
scipy.optimize
中的一个优化器来完成,但我感觉约束的形式可能不正确


可能还包括分配问题的算法。

有一个作为python扩展模块的实现,它支持numpy。我在我的旧笔记本电脑上成功地使用了它。但是,它在我的新机器上不起作用-我假设“新”numpy版本(或64位arch)有问题。

现在在scikit learn中有一个munkres算法的numpy实现,它唯一的依赖项是numpy。我尝试了一些大约20x20的矩阵,它似乎是问题中链接到的矩阵的4倍。cProfiler显示100次迭代的时间分别为2.517秒和9.821秒。

我希望较新的
scipy.optimize.linear\u sum\u赋值
会最快,但(可能并不奇怪)它(没有pip支持)会明显更快,至少在我的用例中是这样的:

更新:使用
munkres
v1.1.2和
scipy
v1.5.0可获得以下结果:

$ python -m timeit -s "from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0); c = np.random.rand(20,30)" "a,b = linear_sum_assignment(c)"
10000 loops, best of 5: 32.8 usec per loop
$ python -m timeit -s "from munkres import Munkres; import numpy as np;  np.random.seed(0); c = np.random.rand(20,30); m = Munkres()" "a = m.compute(c)"
100 loops, best of 5: 2.41 msec per loop
$ python -m timeit -s "from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0);" "c = np.random.rand(20,30); a,b = linear_sum_assignment(c)"
5000 loops, best of 5: 51.7 usec per loop
$ python -m timeit -s "from munkres import Munkres; import numpy as np;  np.random.seed(0)" "c = np.random.rand(20,30); m = Munkres(); a = m.compute(c)"
10 loops, best of : 26 msec per loop

另一个快速实现,正如@Matthew:
scipy.optimize所暗示的,有一个名为
linear\u sum\u assignment
的函数。从文档中:

使用的方法是匈牙利算法,也称为Munkres或Kuhn-Munkres算法


自2.4版(2019-10-16发布)起,NetworkX通过
nx.算法、二分体、最小权重和完整匹配来解决问题。在撰写本文时,该实现在引擎盖下使用了SciPy的
SciPy.optimize.linear\u sum\u分配
,因此期望具有相同的性能特征。

除了在
SciPy.optimize.linear\u sum\u分配中的解算器之外,其他一些答案中已经提到了SciPy(从1.6.0开始)还附带了一个稀疏友好的解算器

[2]中的
:来自scipy.sparse导入随机
在[3]中:从scipy.sparse.csgraph导入最小权重完全二分匹配
在[4]中:来自scipy.optimize导入线性和赋值
[15]中:稀疏=随机(1000,1000,密度=0.01,格式='csr')
在[16]中:%timeit min_weight_full_bipartite_matching(稀疏)
每个回路3.84 ms±12.4µs(7次运行的平均值±标准偏差,每个100个回路)
[17]中:稠密=稀疏。toarray()
在[18]中:%timeit线性和赋值(稠密)
每个回路18.8 ms±291µs(7次运行的平均值±标准偏差,每个10个回路)

它没有用numpy实现,真是太遗憾了。它不仅可能更快,而且算法也必须更易于用numpy表达。这将作为0.18版的
scipy.optimize.linear\u sum\u assignment
包含在scipy中。0.21中不推荐使用线性\u assignment\u模块,将从0.23中删除。改为使用scipy.optimize.linear\u sum\u分配。从scipy版本0.18中有一个实现
scipy.optimize.linear\u sum\u分配
。我刚刚尝试了我的案例库,使用Cython版本获得了25倍的加速!我还尝试了cython版本,并获得了巨大的加速。只需要学习从源安装,因为它显然缺少PIP支持实现<代码> SimPy。优化C++。新的实现将在SciPy 1.4.0中提供,并应在速度上提供实质性的改进。是的。
SciPy.optimize.linear\u sum\u assignment
的更新实现非常快。
1000 x 1000
成本矩阵需要70毫秒才能求解。