我有一个numpy数组,如:
array = [0.2, 0.3, 0.4]
(这个矢量实际上是300k密度的大小,我只用简单的例子说明)
以及使用Scipy创建的稀疏对称矩阵,如下所示:
M = [[0, 1, 2]
[1, 0, 1]
[2, 1, 0]]
(表示密集只是为了说明;在我的实际问题中它是一个(300k x 300k)稀疏矩阵)
是否可以将所有行乘以数组中的元素,然后对列进行相同的操作?
这将首先导致:
M = [[0 * 0.2, 1 * 0.2, 2 * 0.2]
[1 * 0.3, 0 * 0.3, 1 * 0.3]
[2 * 0.4, 1 * 0.4, 0 * 0.4]]
(行与数组中的元素相乘)
M = [[0, 0.2, 0.4]
[0.3, 0, 0.3]
[0.8, 0.4, 0]]
然后列数相乘:
M = [[0 * 0.2, 0.2 * 0.3, 0.4 * 0.4]
[0.3 * 0.2, 0 * 0.3, 0.3 * 0.4]
[0.8 * 0.2, 0.4 * 0.3, 0 * 0.4]]
最后导致:
M = [[0, 0.06, 0.16]
[0.06, 0, 0.12]
[0.16, 0.12, 0]]
我已经尝试应用我在this thread中找到的解决方案,但它没有正确,仍然不明白为什么!
只是要指出这一点,我将运行这个操作的矩阵有点大,它有2000万个非零元素,所以效率非常重要!
我感谢您的帮助!
Edit:
按位解决方案非常有效 . 计算此操作需要1.72秒,但这对我们的工作没有问题 . TNX!
2 回答
通常,您希望避免循环并使用矩阵运算来提高速度和效率 . 在这种情况下,解决方案是简单的线性代数,或者更具体地说是矩阵乘法 .
要将M的列乘以数组A,乘以M * diag(A) . 要将M的行乘以A,乘以diag(A)* M.要做到这两点:diag(A)* M * diag(A),可以通过以下方式完成:
diag(A)这里是一个矩阵,除了在其对角线上有A之外都是零 . 您可以使用方法轻松创建此矩阵(例如numpy.diag()和scipy.sparse.diags()) .
我希望这会非常快 .
以下应该有效:
例:
由于floating point arithmetic的限制,值略有偏差 . 如果舍入错误不可接受,请使用decimal模块 .