有什么方法可以利用其结构来计算COO稀疏矩阵的Hadamard乘积吗?

时间:2019-06-25 15:36:11

标签: python scipy elementwise-operations

我正在尝试计算以COO稀疏格式(以SciPy格式)存储的两个矩阵的Hadamard乘积。有一个lecture

  

快速简便的逐项操作,直接操作数据数组(快速的NumPy机械)

我理解求和和差的部分,因为我们可以将matrix.row,matrix.column和matrix.data连接起来。但是,我想通过利用COO结构来计算Hadamard /逐项乘积实际上是很简单的(可能必须匹配坐标并应用“&”)。

有什么方法可以使用COO稀疏格式更有效地计算Hadamard产品吗?还是只是误解?

1 个答案:

答案 0 :(得分:0)

multiply方法按元素进行乘法。

这里是一个示例,其中ab是COO格式的稀疏矩阵。 (.A属性返回一个常规的numpy数组。我用它来显示稀疏矩阵中的值。)

In [41]: a                                                                                                                            
Out[41]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 20 stored elements in COOrdinate format>

In [42]: a.A                                                                                                                          
Out[42]: 
array([[0, 9, 2, 9, 0, 6, 6, 2],
       [2, 0, 0, 0, 1, 0, 8, 0],
       [0, 3, 0, 0, 2, 9, 0, 4],
       [0, 0, 0, 0, 0, 0, 0, 5],
       [0, 0, 7, 1, 0, 0, 7, 7]])

In [43]: b                                                                                                                            
Out[43]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 20 stored elements in COOrdinate format>

In [44]: b.A                                                                                                                          
Out[44]: 
array([[0, 0, 0, 7, 9, 0, 5, 0],
       [0, 7, 0, 0, 6, 6, 0, 0],
       [3, 0, 2, 0, 3, 0, 0, 0],
       [5, 0, 0, 3, 0, 0, 7, 0],
       [8, 0, 6, 8, 0, 0, 4, 0]])

计算ab的按元素乘积。请注意,c使用CSR格式。

In [45]: c = a.multiply(b)                                                                                                            

In [46]: c                                                                                                                            
Out[46]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 7 stored elements in Compressed Sparse Row format>

In [47]: c.A                                                                                                                          
Out[47]: 
array([[ 0,  0,  0, 63,  0,  0, 30,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 42,  8,  0,  0, 28,  0]], dtype=int64)

通过计算相应的numpy数组的元素乘积来验证结果。

In [48]: a.A * b.A                                                                                                                    
Out[48]: 
array([[ 0,  0,  0, 63,  0,  0, 30,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 42,  8,  0,  0, 28,  0]])