我正在尝试从一个巨大的CSR矩阵(SciPy)中过滤小于10的值。 由于所有的值都是整数,除以10再乘以10可以实现,但我想知道是否有更好的方法来筛选元素。
编辑: 下面的答案可行。请检查您是否安装了最新版本的SciPy。
我正在尝试从一个巨大的CSR矩阵(SciPy)中过滤小于10的值。 由于所有的值都是整数,除以10再乘以10可以实现,但我想知道是否有更好的方法来筛选元素。
编辑: 下面的答案可行。请检查您是否安装了最新版本的SciPy。
你也可以选择更不熟练但可能更慢的方法:
m = m.multiply(m >= 10)
为了理解正在发生的事情:
>>> m = scipy.sparse.csr_matrix((1000, 1000), dtype=np.int)
>>> m[np.random.randint(0, 1000, 20),
np.random.randint(0, 1000, 20)] = np.random.randint(0, 100, 20)
>>> m.data
array([92, 46, 99, 24, 75, 16, 49, 60, 87, 64, 91, 37, 30, 32, 25, 40, 99,
9, 3, 84])
>>> m >= 10
<1000x1000 sparse matrix of type '<type 'numpy.bool_'>'
with 18 stored elements in Compressed Sparse Row format>
>>> m = m.multiply(m >= 10)
>>> m
<1000x1000 sparse matrix of type '<type 'numpy.int32'>'
with 18 stored elements in Compressed Sparse Row format>
>>> m.data
array([92, 46, 99, 24, 75, 16, 49, 60, 87, 64, 91, 37, 30, 32, 25, 40, 99,
84])
scipy.sparse
仍在不断发展中,每次发布都会有巨大的功能飞跃。但是,虽然我们还没有达到那个目标,最终的目标应该是能够像处理任何数组一样进行m[m < 10] = 0
,然后完成它。我认为我的答案更接近这个理想。 - Jaimem.data[m.data < 10] = 0; m.eliminate_zeros()
。 - Jaimem >= 0
使用了m.__gt__
。(我没有早期版本的scipy
来测试,但我相信有一个或多个SO线程讨论了这个问题)。m.data *= m.data>=10
m.eliminate_zeros()
numpy
操作将选定的值设置为0。测试可能会更加复杂。然后使用标准的sparse
函数进行清理。当你说“过滤”时,你想做的本质上就是这样:将某些值设为零并从稀疏矩阵中删除它们。