我正在尝试计算以COO稀疏格式(以SciPy格式)存储的两个矩阵的Hadamard乘积。有一个lecture读
快速简便的逐项操作,直接操作数据数组(快速的NumPy机械)
我理解求和和差的部分,因为我们可以将matrix.row,matrix.column和matrix.data连接起来。但是,我想通过利用COO结构来计算Hadamard /逐项乘积实际上是很简单的(可能必须匹配坐标并应用“&”)。
有什么方法可以使用COO稀疏格式更有效地计算Hadamard产品吗?还是只是误解?
答案 0 :(得分:0)
multiply
方法按元素进行乘法。
这里是一个示例,其中a
和b
是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]])
计算a
和b
的按元素乘积。请注意,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]])