我正在尝试将此代码转换为使用scipy稀疏矩阵,因为实际矩阵非常大,但我遇到了麻烦 . 请任何人可以帮忙吗?
import numpy as np
G = np.array([[0., 50., 50., 0.],
[10., 0., 10., 0.],
[0., 0., 0., 10.],
[2., 0., 2., 0.]])
s = G.sum(axis=0)
m = np.minimum(G, 1).transpose()
sm = s * m
sm_rnorm = (sm / sm.sum(axis=0))
smm = sm * sm_rnorm
G += smm.transpose()
print(G)
我尝试了以下方法:
import numpy as np
from scipy.sparse import csc_matrix
G = np.array([[0.,50.,50.,0.],
[10.,0.,10.,0.],
[0.,0.,0.,10.],
[2.,0.,2.,0.]])
G = csc_matrix(G, dtype=np.float)
s = csc_matrix(G.sum(axis=0))
m = csc_matrix.minimum(G, 1).transpose()
sm = s * m
sm_rnorm = (sm / csc_matrix(sm.sum(axis=0)))
smm = sm * sm_rnorm
G += smm.transpose()
print(G)
...但得到 ValueError: dimension mismatch
1 回答
我跑密码,
然后启动稀疏版本:
哎呀:
*
如果np.matrix
和稀疏矩阵的矩阵乘法稀疏矩阵元明智乘法:
现在匹配
sm_rnorm
:sparse/dense
以元素方式工作,但sparse/sparse
有问题:我认为这是一个矩阵划分问题,但我会进一步深入研究 .
sm_m.multiply(1 / sm_m.sum(axis=0))
给出一个具有正确值的稀疏矩阵,但速度较慢(至少对于此示例) .smm_m = sm_m.multiply( sm_m / sm_m.sum(axis=0))
匹配smm
. 并且Gm += smm_m
有效 . 稀疏+=
没有't raise an efficiency error because it doesn'吨改变稀疏性 .因此关键问题是保持矩阵乘法和元素乘法(以及相应的除法) .
w / sklearn
sklearn.utils.sparsefuncs
有一些稀疏的实用功能以上
sm_m
是coo
格式数组(不确定原因):将其转换为
csr
:派生列缩放数组:
在地点应用扩展:
inplace column_scale很简单:
m_m.multiply(s_m)
步也可以这样做:我怀疑代码可以清理,删除转置等 .
G
天生就是方形?我喜欢使用非方形数组来更好地跟踪形状,转置和尺寸总和 . 我尝试将G
扩展为(5,4),并在s*m
步骤遇到问题 .