scipy 稀疏数组中x〈i值的有效替换

gz5pxeao  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(143)

如何在不触发SparseEfficiencyWarning且不降低稀疏度的情况下,将数组中小于4的值替换为0?

from scipy import sparse
x = sparse.csr_matrix(
    [[0, 1, 2, 3, 4],
     [1, 2, 3, 4, 5],
     [0, 0, 0, 2, 5]])
x[x < 4] = 0
x.toarray()  # verifies that this works

还要注意,x的初始版本之间的稀疏度是11个存储元素,在进行掩码之后,其上升到15个存储元素。

o2rvlv0m

o2rvlv0m1#

直接操作数据数组

from scipy import sparse
x = sparse.csr_matrix(
    [[0, 1, 2, 3, 4],
     [1, 2, 3, 4, 5],
     [0, 0, 0, 2, 5]])

x.data[x.data < 4] = 0

>>> x.toarray()
array([[0, 0, 0, 0, 4],
       [0, 0, 0, 4, 5],
       [0, 0, 0, 0, 5]])

>>> x.data
array([0, 0, 0, 4, 0, 0, 0, 4, 5, 0, 5])

请注意,稀疏度保持不变,除非您运行x.eliminate_zeros(),否则稀疏度值为零。

x.eliminate_zeros()
>>> x.data
array([4, 4, 5, 5])

如果出于某种原因,你不想在numpy中使用布尔掩码和花哨的索引,你可以用numba循环数组:

import numba

@numba.jit(nopython=True)
def _set_array_less_than_to_zero(array, value):

    for i in range(len(array)):
        if array[i] < value:
            array[i] = 0

这也应该比numpy索引快一个相当大的程度。

array = np.arange(10)
_set_array_less_than_to_zero(array, 5)

>>> array
array([0, 0, 0, 0, 0, 5, 6, 7, 8, 9])

相关问题