2017-05-05 6 views
2

Scipy(v0.18.1)のブール演算を使用して、スパース(2進)配列の列を結合したいと考えています。高密度マトリックスの場合、それはうまく動作します:Scipyスパース行列:ブール値の組み合わせ

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

1つの列に崩壊します。しかし、これをスパース配列で行うとエラーが発生します。ブール部分の

エラー:〜(反転)部分の

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

がエラー:

bad operand type for unary ~: 'csc_matrix' 
+1

単項 '〜'を適用する前にスライスを密に変換する必要があるかもしれません。スパース行列を反転すると、とにかく(おそらくは_非常に)密行列が得られます。 –

+1

@LucaCiti良い点!彼らはおそらく、パフォーマンス(および一貫性)の理由でそれを実装しなかったでしょう。なぜなら、希薄なマトリックスの補完は、もはやまばらではありません。 –

+0

@ LucaCitiさて、おそらく私はゼロ以外の要素をチェックしてトリックをすることができます。ブール値の部分はどうですか? – cgreen

答えて

0

一つは「(要素ごとの乗算a.multiply(b)( "と")と追加a+bを使用することができますか")をバイナリ演算を実装するために使用します。否定~に関しては、スライスを密に変換する価値があるかもしれません。なぜなら、疎な行列の否定は、とにかく(おそらくは非常に)密な行列を与えるからです。場合によっては、De Morganの法律を慎重に使用することで、大幅な相違が生じ、可能な限り、そのような変換の必要性を回避(または軽減)するのに役立ちます。

data[:,5] & ~data[:,23]の可能なトリックはdata[:,5] > data[:,23]です。

data[:,5] & ~data[:,23] & data[:,400]は、あまり読みにくくはないが、(data[:,5] > data[:,23]).multiply(data[:,400])と書くことができます。

+0

私は(1000,1000)マトリックスで様々な組み合わせを試してみましたが、単に3つの列を索引付けするだけでタイミングが支配的です。 – hpaulj

+0

@hpaulj可能であれば、それはむしろ小さな行列であり、密度の高い行列を使用する方が実際には高速かもしれません。私は自然言語処理で、数千(単語数)の簡単な数百万(例えば、つぶやき数)のドキュメント用語行列を思いつく状況を想像しています。私は試していないが、その場合、密度の高いものに変換することは決して大きな違いにはならないと思います。 –

関連する問題