【问题标题】:Efficiently applying a threshold function to SciPy sparse csr_matrix有效地将阈值函数应用于 SciPy 稀疏 csr_matrix
【发布时间】:2017-12-05 23:54:55
【问题描述】:

我有一个 1 列 x 行的 SciPy csr_matrix(在这种情况下是一个向量)。其中是浮点值,我需要将其转换为离散类标签 -1、0 和 1。这应该通过将浮点值映射到这 3 个类标签之一的阈值函数来完成。

除了迭代Iterating through a scipy.sparse vector (or matrix) 中描述的元素之外,没有别的办法吗?我很想有一些优雅的方式来以某种方式在所有元素上映射(thresholdfunc())。

请注意,虽然它是 csr_matrix 类型,但它实际上并不是稀疏的,因为它只是涉及稀疏矩阵的另一个函数的返回。

【问题讨论】:

  • csc 格式在表示列向量时更加紧凑。
  • 如果不是特别稀疏,那么我建议使用密集数组版本,M.toarray()(或M.A)。
  • 谢谢!如果我只迭代一次,是否值得先将其转换为数组?我的意思是,转换的开销不是会吃掉数组的优势吗?

标签: python numpy scipy sparse-matrix array-broadcasting


【解决方案1】:

如果您有一个数组,您可以使用np.where 函数根据某些条件进行离散化。例如:

>>> import numpy as np
>>> x = np.arange(10)
>>> np.where(x < 5, 0, 1)
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

语法是np.where(BOOLEAN_ARRAY, VALUE_IF_TRUE, VALUE_IF_FALSE)。 您可以将两个where 语句链接在一起以具有多个条件:

>>> np.where(x < 3, -1, np.where(x > 6, 0, 1))
array([-1, -1, -1,  1,  1,  1,  1,  0,  0,  0])

要将其应用于 CSR 或 CSC 稀疏矩阵中的数据,您可以使用 .data 属性,它使您可以访问包含稀疏矩阵中所有非零条目的内部数组。例如:

>>> from scipy import sparse
>>> mat = sparse.csr_matrix(x.reshape(10, 1))
>>> mat.data = np.where(mat.data < 3, -1, np.where(mat.data > 6, 0, 1))
>>> mat.toarray()
array([[ 0],
       [-1],
       [-1],
       [ 1],
       [ 1],
       [ 1],
       [ 1],
       [ 0],
       [ 0],
       [ 0]])

【讨论】:

  • 这在语法糖方面看起来不错,谢谢。我想它不会快多少,从关于 np.where() 性能的快速搜索。
  • np.where 类似于其他 numpy 矢量化函数,其中循环在编译后的代码中执行。一般来说,它比使用 Python for 循环对除最小数组之外的所有元素进行迭代要快得多。
猜你喜欢
  • 2020-12-07
  • 2016-08-31
  • 2021-02-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2012-06-30
  • 2022-11-03
  • 2011-02-02
相关资源
最近更新 更多