【问题标题】:Filter values from a scipy sparse matrix从 scipy 稀疏矩阵中过滤值
【发布时间】:2014-03-31 05:10:39
【问题描述】:

我正在尝试从巨大的 (1Mx1M) CSR 矩阵 (SciPy) 中过滤小于 10 的值。 由于我所有的值都是整数,除以 10 再乘以 10 就可以了,但我想知道是否有更好的方法来过滤元素。

编辑: 下面的答案有效。检查您是否拥有最新版本的 SciPy。

【问题讨论】:

  • 它是如何工作的? 11 / 10 * 10 = 10,不是 11。
  • 好吧,对于我的具体应用来说已经足够好了,但就像我说的,应该有更好(即更快、更准确)的方法。

标签: python scipy sparse-matrix


【解决方案1】:

你也可以选择不那么老套的,但可能更慢:

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])

【讨论】:

  • 我不确定将压缩表示的直接操作称为“hacky”是否公平——毕竟表示是documented
  • 请不要误会我的意思,我认为您的回答完全有效。你目前的单票是我的。 ;) 我有关于稀疏矩阵的答案,这些矩阵与所有三个内部数组都发生了可怕的并发症。这种骇人听闻的操作是有道理的,因为scipy.sparse 正在酝酿之中,而且每次发布都会带来巨大的功能飞跃。但是,虽然我们还没有到那一步,但最终目标应该是让m[m &lt; 10] = 0 成为可能,就像对任何数组所做的那样,并完成它。我认为我的答案更接近于那个理想。
  • 谢谢杰米!将 (m >= 10) 解释为矩阵是一项新功能吗?它似乎不适用于我的 SciPy 版本。
  • @Omer 我必须将 Scipy 从 0.10 升级到 0.13 才能正常工作
  • 什么是 hacky 但更快的版本?
【解决方案2】:

我认为版本问题与比较运算符的实现有关。 m &gt;= 0,使用 m.__gt__。 (我没有scipy 的早期版本来测试这个,但我相信这个主题有一个或多个 SO 线程)。

可能在早期版本中起作用的是:

m.data *= m.data>=10
m.eliminate_zeros()

换句话说,使用标准的numpy 操作将选定的值设置为0。测试可能要复杂得多。然后使用标准的sparse 函数来清理它。当您说“过滤”时,这实际上就是您想要做的,不是吗:将一些值设置为零并将它们从稀疏矩阵中删除?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2017-03-26
    • 2023-04-10
    • 2017-07-21
    • 2011-11-28
    • 2017-07-02
    • 2011-03-07
    相关资源
    最近更新 更多