gpt4 book ai didi

python - 稀疏矩阵的逐元素划分,忽略 0/0

转载 作者:太空狗 更新时间:2023-10-30 01:31:31 24 4
gpt4 key购买 nike

我有两个稀疏矩阵 E 和 D,它们在相同位置有非零项。现在我想将 E/D 作为稀疏矩阵,仅在 D 不为零的地方定义。

例如采用以下代码:

import numpy as np
import scipy

E_full = np.matrix([[1.4536000e-02, 0.0000000e+00, 0.0000000e+00, 1.7914321e+00, 2.6854320e-01, 4.1742600e-01, 0.0000000e+00],
[9.8659000e-03, 0.0000000e+00, 0.0000000e+00, 1.9106752e+00, 5.7283640e-01, 1.4840370e-01, 0.0000000e+00],
[1.3920000e-04, 0.0000000e+00, 0.0000000e+00, 9.4346500e-02, 2.8285900e-02, 4.3967800e-02, 0.0000000e+00],
[0.0000000e+00, 4.5182676e+00, 0.0000000e+00, 0.0000000e+00, 7.3000000e-06, 1.5100000e-05, 4.0746900e-02],
[0.0000000e+00, 0.0000000e+00, 3.4002088e+00, 4.6826200e-02, 0.0000000e+00, 2.4246900e-02, 3.4529236e+00]])
D_full = np.matrix([[0.36666667, 0. , 0. , 0.33333333, 0.2 , 0.1 , 0. ],
[0.23333333, 0. , 0. , 0.33333333, 0.4 , 0.03333333, 0. ],
[0.06666667, 0. , 0. , 0.33333333, 0.4 , 0.2 , 0. ],
[0. , 0.63636364, 0. , 0. , 0.04545455, 0.03030303, 0.28787879],
[0. , 0. , 0.33333333, 0.33333333, 0. , 0.22222222, 0.11111111]])
E = scipy.sparse.dok_matrix(E_full)
D = scipy.sparse.dok_matrix(D_full)

然后除法 E/D 产生一个完整的矩阵。

matrix([[3.96436360e-02,            nan,            nan, 5.37429635e+00, 1.34271600e+00, 4.17426000e+00,            nan],
[4.22824292e-02, nan, nan, 5.73202566e+00, 1.43209100e+00, 4.45211145e+00, nan],
[2.08799990e-03, nan, nan, 2.83039503e-01, 7.07147500e-02, 2.19839000e-01, nan],
[ nan, 7.10013476e+00, nan, nan, 1.60599984e-04, 4.98300005e-04, 1.41541862e-01],
[ nan, nan, 1.02006265e+01, 1.40478601e-01, nan, 1.09111051e-01, 3.10763127e+01]])

我也尝试了不同的包。

import sparse
sparse.COO(E) / sparse.COO(D)

这让我出错了。

ValueError: Performing this operation would produce a dense result: <ufunc 'true_divide'>

因此它也尝试创建一个密集矩阵。

我知道这是因为 0/0 = nan。但无论如何我对这些值(value)观不感兴趣。那么我怎样才能避免计算它们呢?

最佳答案

更新:(受 sacul 启发)创建一个空的 dok_matrix 并仅修改 D 的非零部分为 nonzero。 (这也适用于 dok_matrix 以外的稀疏矩阵。)

F = scipy.sparse.dok_matrix(E.shape)
F[D.nonzero()] = E[D.nonzero()] / D[D.nonzero()]

你可以试试 update + nonzero dok_matrix 的方法。

nonzero_idx = [tuple(l) for l in np.transpose(D.nonzero())]
D.update({k: E[k]/D[k] for k in nonzero_idx})

首先,我们使用 nonzero 确定矩阵 D 中不为 0 的索引。然后,我们将索引放入 update 我们提供字典的方法

{k: E[k]/D[k] for k in nonzero_idx}

这样 D 中的值将根据该字典进行更新。

解释:

D.update({k: E[k]/D[k] for k in nonzero_idx}) 的作用是

for k in {k: E[k]/D[k] for k in nonzero_idx}.keys():
D[k] = E[k]/D[k]

请注意,这改变了 D。如果您想创建一个新的稀疏矩阵而不是就地修改 D,请将 D 复制到另一个矩阵,比如 ret

nz = [tuple(l) for l in np.transpose(D.nonzero())]
ret = D.copy()
ret.update({k: E[k]/D[k] for k in nz})

关于python - 稀疏矩阵的逐元素划分,忽略 0/0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50530158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com