我想在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'
1 回答
可以在稀疏布尔矩阵之间使用元素乘法
a.multiply(b)
("and")和加法a+b
("or")来实现二进制运算 . 关于否定~
,可能值得将切片转换为密集,因为否定稀疏矩阵无论如何都会给出(可能非常)密集的矩阵 . 在某些情况下,谨慎使用De Morgan的法律可能会产生重大影响,并且如果可能的话,有助于避免(或减少)对此类转换的需求 .data[:,5] & ~data[:,23]
的一个可能技巧可能是data[:,5] > data[:,23]
.data[:,5] & ~data[:,23] & data[:,400]
可以写成(data[:,5] > data[:,23]).multiply(data[:,400])
虽然它不是很易读 .