当前位置: 首页 > 知识库问答 >
问题:

为什么scipy稀疏数组和numpy数组的乘法函数给出不同的结果?

阴靖
2023-03-14

在Python 2.7中我有两个矩阵:一个是密集的A_Dence,另一个是稀疏的A_Sparse。我对计算元素相乘和感兴趣。有两种方法:使用numpy的乘法或scipy稀疏乘法。我希望它们在执行时间上会给出完全相同的结果。但我发现,对于某些矩阵大小,它们给出了不同的结果。

import numpy as np
from scipy import sparse
L=2000
np.random.seed(2)
rand_x=np.random.rand(L)
A_sparse_init=np.diag(rand_x, -1)+np.diag(rand_x, 1)
A_sparse=sparse.csr_matrix(A_sparse_init)
A_dense=np.random.rand(L+1,L+1)
print np.sum(A_sparse.multiply(A_dense))-np.sum(np.multiply(A_dense[A_sparse.nonzero()], A_sparse.data))

产出:

1.1368683772161603e-13

如果我选择L=2001,那么输出是:

0.0

为了使用两种不同的乘法检查差异的大小依赖关系,我写道:

L=100
np.random.seed(2)
N_loop=100
multiply_diff_arr=np.zeros(N_loop)
for i in xrange(N_loop):
    rand_x=np.random.rand(L)
    A_sparse_init=np.diag(rand_x, -1)+np.diag(rand_x, 1)
    A_sparse=sparse.csr_matrix(A_sparse_init)
    A_dense=np.random.rand(L+1,L+1)
    multiply_diff_arr[i]=np.sum(A_sparse.multiply(A_dense))-np.sum(np.multiply(A_dense[A_sparse.nonzero()], A_sparse.data))
    L+=1

有人能帮我了解发生了什么吗?难道我们不希望两种方法之间的差异至少是1E-18,而不是1E-13吗?

共有1个答案

慕金林
2023-03-14

我没有完整的答案,但这可能有助于找到答案:

在底层,scipy.sparse将转换为COO格式,并执行以下操作:

ret = self.tocoo()
if self.shape == other.shape:
    data = np.multiply(ret.data, other[ret.row, ret.col])

那么问题是为什么这两个操作会给出不同的结果:

ret = A_sparse.tocoo()
c = np.multiply(ret.data, A_dense[ret.row, ret.col])
ret.data = c.view(type=np.ndarray)

c.sum() - ret.sum()

-1.1368683772161603e-13
A_sparse.multiply(A_dense).sum(axis=1).sum()
A_sparse.multiply(A_dense).sum(axis=0).sum()

Numpy首先默认为0

 类似资料:
  • 请看示例代码(注意 data 的数组下标): -- http://www.kyne.com.au/~mark/software/lua-cjson.php -- version: 2.1 devel local json = require("cjson") local data = {1, 2} data[1000] = 99 -- ... do the other things ngx.

  • 稀疏数组核心 第一行表示了稀疏数组的组成核心,稀疏数组一共只有三列 第一行第一列表示数组一共有多少行,第一行第二列表示数组一共有多少行,第一行第三列表示数组中有多少个特殊值 从第一行之后的所有行表示数据行,第一列表示数据所在的行数,第二列表示数据坐在的列数,第三列表述具体数据的值 def get_sparse_arr(arr: 'sparse_arr') -> 'sparse_arr':

  • 问题内容: 也就是说,如果我将当前时间用作数组的索引: 解释器将实例化从0到现在的所有元素吗?不同的浏览器会做不同的事情吗? 我记得AIX内核中曾经存在一个错误,该错误会在请求时创建伪tty,但是如果您说“ echo> / dev / pty10000000000”,它将创建/ dev / pty0,/ dev / pty1, ....然后跌倒死亡。在贸易展览会上这很有趣,但是我不希望这种情况发生

  • 问题内容: 我正在尝试重新实现matlab工具箱之一。他们在那边使用fft。当我对相同的数据执行相同的操作时,我得到的结果与Matlab的结果不同。看看: MATLAB : PYTHON : 如果我弄乱了np.fft.fft()/ np.fft.fft2()/ np.fft.fftn()的参数(轴等),则可以得到的最佳值是相同的,但发生了变化。不幸的是,手动移位不是一种选择,因为Msig矩阵的大小

  • 本文向大家介绍实现稀疏数组的C ++程序,包括了实现稀疏数组的C ++程序的使用技巧和注意事项,需要的朋友参考一下 稀疏矩阵是其中大多数元素为0的矩阵。其示例如下。 下面给出的矩阵包含5个零。由于零的数量大于矩阵元素的一半,因此它是稀疏矩阵。 算法 示例 输出结果

  • 问题内容: 我在PHP中有以下数组: 我想将其JSON编码为JSON数组,产生类似以下内容的字符串: 但是当我调用此数组时,得到以下信息: 这是一个对象而不是数组。 我怎样才能将我的数组编码为数组呢? 问题答案: 您正在观察此行为,因为您的数组不是顺序的-它具有键和,但没有键。 仅具有数字索引是不够的。仅当您的PHP数组是顺序的时,即如果其键为0、1、2、3,…时,才会将PHP数组编码为JSON数