我有一个问题,这是非常类似的肖恩劳尔斯的例子,你可以在这里找到:https://seanlaw.github.io/2019/02/27/set-values-in-sparse-matrix/
在我的例子中,我想删除稀疏csr矩阵中的所有元素,这些元素的绝对值小于某个epsilon。
首先我试了一下
x[abs(x) < 3] = 0
但是SciPy对效率的警告让我在上面的链接中找到了SeanLaws的解释,然后我试着操作他的示例代码,但是没有找到解决问题的方法。
下面是添加了一些负数项的代码。示例代码将删除所有负数项,因为它们小于3。我尝试了np.abs(),也尝试了添加第二个逻辑运算符,但到目前为止都没有成功。
import numpy as np
from scipy.sparse import csr_matrix
x = csr_matrix(np.array([[1, 0.1, -2, 0, 3],
[0, -4, -1, 5, 0]]))
nonzero_mask = np.array(x[x.nonzero()] < 3)[0]
rows = x.nonzero()[0][nonzero_mask]
cols = x.nonzero()[1][nonzero_mask]
x[rows, cols] = 0
print(x.todense())
给予
[[0. 0. 0. 0. 3.]
[0. 0. 0. 5. 0.]]
但我想要的是
[[0. 0. 0. 0. 3.]
[0. -4. 0. 5. 0.]]
任何帮助都非常感谢,我觉得我错过了一些非常基本的东西。提前感谢!
2条答案
按热度按时间km0tfn4u1#
您对
x
的测试也选择了0值,因此出现了效率警告,但只应用于data
属性中的非零值:这实际上并没有从矩阵中删除元素,但有一种方法可以进行清理:
bpzcxfmw2#
将
x[x.nonzero()]
Package 到np.abs()
解决了这个问题: