通过Array中的元素乘以Python Sparse Matrix的行和列

时间:2012-10-31 17:05:05

标签: python sparse-matrix operations

我有一个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中找到的解决方案,但它没有用;我将M的数据乘以建议的数组中的元素,然后转换矩阵并应用相同的操作,但结果不正确,仍然不明白为什么!

只是指出这一点,我将运行此操作的矩阵有点大,它有2000万个非零元素,因此效率非常重要!

感谢您的帮助!

修改

Bitwise解决方案非常有效。计算此操作需要1.72秒,但这对我们的工作没有问题。 TNX!

3 个答案:

答案 0 :(得分:7)

通常,您希望避免循环并使用矩阵运算来提高速度和效率。在这种情况下,解是简单的线性代数,或者更具体地说是矩阵乘法。

要将M的列乘以数组A,乘以M * diag(A)。要将M的行乘以A,乘以diag(A)* M.要做到这两点:diag(A)* M * diag(A),可以通过以下方式完成:

numpy.dot(numpy.dot(a, m), a)

diag(A)这里是一个矩阵,除了在其对角线上有A之外都是零。您可以使用方法轻松创建此矩阵(例如numpy.diag()和scipy.sparse.diags())。

我希望这会非常快。

答案 1 :(得分:1)

以下内容应该有效:

[[x*array[i]*array[j] for j, x in enumerate(row)] for i, row in enumerate(M)]

示例:

>>> array = [0.2, 0.3, 0.4]
>>> M = [[0, 1, 2], [1, 0, 1], [2, 1, 0]]
>>> [[x*array[i]*array[j] for j, x in enumerate(row)] for i, row in enumerate(M)]
[[0.0, 0.059999999999999998, 0.16000000000000003], [0.059999999999999998, 0.0, 0.12], [0.16000000000000003, 0.12, 0.0]]

由于floating point arithmetic的限制,值略有偏差。如果舍入错误不可接受,请使用decimal模块。

答案 2 :(得分:0)

我使用这种组合:

String basePath = ".\\src\\main\\resources";

当轴为1(乘以行)时,我复制了this solution的第二种方法, 当轴为0(乘以列)时,我使用multiply

就地结果(轴= 1)更有效。