我
M闲逛:
In [241]: MOut[241]: <6x3 sparse matrix of type '<class 'numpy.uint8'>' with 6 stored elements in Compressed Sparse Row format>In [242]: M.AOut[242]: array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 0], [0, 0, 1], [1, 0, 0]], dtype=uint8)In [243]: M.sum(1) # dense matrixOut[243]: matrix([[1], [1], [1], [1], [1], [1]], dtype=uint32)In [244]: M/M.sum(1) # dense matrix - full size of MOut[244]: matrix([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.], [ 0., 1., 0.], [ 0., 0., 1.], [ 1., 0., 0.]])
M太大,则会
M.A产生内存错误。
In [262]: S = sparse.csr_matrix(M.sum(1))In [263]: S.shapeOut[263]: (6, 1)In [264]: M.shapeOut[264]: (6, 3)In [265]: M/S....ValueError: inconsistent shapes
我不完全确定这里发生了什么。
元素明智的乘法工作
In [266]: M.multiply(S)Out[266]: <6x3 sparse matrix of type '<class 'numpy.uint32'>' with 6 stored elements in Compressed Sparse Row format>
所以如果我构造
S为
S = sparse.csr_matrix(1/M.sum(1))
如果某些行的总和为零,则存在除以零的问题。
如果我修改
M为0行
In [283]: M.AOut[283]: array([[1, 0, 0], [0, 1, 0], [0, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0]], dtype=uint8)In [284]: S = sparse.csr_matrix(1/M.sum(1))/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in true_divide #!/usr/bin/python3In [285]: S.AOut[285]: array([[ 1.], [ 1.], [ inf], [ 1.], [ 1.], [ 1.]])In [286]: M.multiply(S)Out[286]: <6x3 sparse matrix of type '<class 'numpy.float64'>' with 5 stored elements in Compressed Sparse Row format>In [287]: _.AOut[287]: array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.], [ 1., 0., 0.]])
这不是最好
M的证明,但是它建议一种有用的方法。行总和将是密集的,因此您可以使用通常的密集数组方法清除其逆。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)