【问题标题】:Scipy sparse matrix: boolean combinations of columnsScipy稀疏矩阵:列的布尔组合
【发布时间】:2017-05-05 21:38:27
【问题描述】:

我想在 Scipy (v0.18.1) 中使用布尔运算来组合稀疏(二进制)数组的列。对于密集矩阵,它可以正常工作:

data[:,5] & ~data[:,23] & data[:,400]

折叠成一列。但是,使用稀疏数组执行此操作时出现错误。

布尔部分错误:

"unsupported operand type(s) for &: 'csc_matrix' and 'csc_matrix'"

~(反转)部分的错误:

bad operand type for unary ~: 'csc_matrix'

【问题讨论】:

  • 在应用一元 ~ 之前,您可能需要将切片转换为密集切片。无论如何,对稀疏矩阵求逆会得到一个(可能非常)密集矩阵。
  • @LucaCiti 好点!他们可能出于性能(和一致性)的原因没有实现它,因为稀疏矩阵的补码不再是真正的稀疏了。
  • @LucaCiti 好的,但也许我可以通过检查非零元素来做一个技巧。布尔部分呢?
  • @cgreen 看我的回答

标签: python numpy scipy sparse-matrix


【解决方案1】:

可以在稀疏布尔矩阵之间使用元素乘法a.multiply(b)(“and”)和加法a+b(“or”)来实现二元运算。关于否定~,可能值得将切片转换为密集矩阵,因为稀疏矩阵的否定无论如何都会给出(可能非常)密集矩阵。在某些情况下,谨慎使用德摩根定律可能会产生重大影响,并尽可能避免(或减少)此类转换的需要。

data[:,5] & ~data[:,23] 的一个可能技巧可能是data[:,5] > data[:,23]

data[:,5] & ~data[:,23] & data[:,400] 可以写成(data[:,5] > data[:,23]).multiply(data[:,400]),虽然它的可读性不是很好。

【讨论】:

  • 我在 (1000,1000) 矩阵上尝试了各种组合,发现简单地索引 3 列占主导地位。
  • @hpaulj 可能,但这是一个相当小的矩阵,使用密集矩阵实际上可能更快。我想象自然语言处理中可能出现的情况类型,其文档术语矩阵很容易达到数百万(例如推文)乘以数千(单词)。我没有尝试过,但在这种情况下,我想永远不要转换为密集型会产生很大的不同。
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2016-05-26
  • 2017-01-19
  • 2012-05-15
  • 2017-03-26
  • 2017-03-31
相关资源
最近更新 更多