holdtom
In [388]: from scipy import sparse 制作样本矩阵:In [390]: M = sparse.random(10,8,.2, 'csc') 我是一个矩阵:In [393]: M.sum(axis=0) Out[393]: matrix([[1.95018736, 0.90924629, 1.93427113, 2.38816133, 1.08713479, 0. , 2.45435481, 0. ]])那些 0 在划分时会产生警告 -nan在结果中:In [394]: M/_ /usr/local/lib/python3.6/dist-packages/scipy/sparse/base.py:599: RuntimeWarning: invalid value encountered in true_divide return np.true_divide(self.todense(), other)Out[394]: matrix([[0. , 0. , 0. , 0. , 0.27079623, nan, 0.13752665, nan], [0. , 0. , 0. , 0. , 0. , nan, 0.32825122, nan], [0. , 0. , 0. , 0. , 0. , nan, 0. , nan], ... nan, 0. , nan]])0 也会给您的方法带来问题:In [395]: for i in range(8): ...: xs = sum(M[:,i]) ...: M[:,i] = M[:,i]/xs.data[0] ...: ---------------------------------------------------------------------------IndexError Traceback (most recent call last)<ipython-input-395-0195298ead19> in <module> 1 for i in range(8): 2 xs = sum(M[:,i])----> 3 M[:,i] = M[:,i]/xs.data[0] 4 IndexError: index 0 is out of bounds for axis 0 with size 0但是,如果我们比较没有 0 和的列,则值匹配:In [401]: Out[394][:,:5] Out[401]: matrix([[0. , 0. , 0. , 0. , 0.27079623], [0. , 0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. , 0. ], [0.49648886, 0.25626608, 0. , 0.19162678, 0.72920377], [0. , 0. , 0.30200765, 0. , 0. ], [0.50351114, 0. , 0.30445113, 0.41129367, 0. ], [0. , 0.74373392, 0. , 0. , 0. ], [0. , 0. , 0.39354122, 0. , 0. ], [0. , 0. , 0. , 0.39707955, 0. ]])In [402]: M.A[:,:5] Out[402]: array([[0. , 0. , 0. , 0. , 0.27079623], [0. , 0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. , 0. ], [0.49648886, 0.25626608, 0. , 0.19162678, 0.72920377], [0. , 0. , 0.30200765, 0. , 0. ], [0.50351114, 0. , 0.30445113, 0.41129367, 0. ], [0. , 0.74373392, 0. , 0. , 0. ], [0. , 0. , 0.39354122, 0. , 0. ], [0. , 0. , 0. , 0.39707955, 0. ]])回到 [394] 我应该首先将矩阵和转换为稀疏,所以结果也将是稀疏的。稀疏没有逐元素除法,所以我必须先求密集矩阵的逆。0 仍然很麻烦。In [409]: M.multiply(sparse.csr_matrix(1/Out[393])) ...Out[409]: <10x8 sparse matrix of type '<class 'numpy.float64'>' with 16 stored elements in Compressed Sparse Column format>