2017-05-05 26 views
2

我想在Scipy(v0.18.1)中使用布爾操作組合列的稀疏(二進制)數組。對於一個密集的矩陣,它可以很好地執行:Scipy稀疏矩陣:列的布爾組合

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

其中摺疊成一列。但是,當我使用稀疏數組進行此操作時出現錯誤。

誤差布爾部分:

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

誤差爲〜(反轉)部分:

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

在應用一元'〜'之前,您可能必須將slice轉換爲dense。無論如何,反轉一個稀疏矩陣都會給出一個(可能是_very_)稠密矩陣。 –

+1

@LucaCiti好點!由於性能(和一致性)的原因,它們可能沒有實現它,導致稀疏矩陣的補碼不再真正稀疏。 –

+0

@LucaCiti好吧,雖然也許我可以做一個檢查非零元素的技巧。那布爾部分呢? – cgreen

回答

0

人們可以使用的elementwise乘法a.multiply(b)( 「和」)和除了a+b(「或「)在稀疏布爾矩陣之間執行二進制操作。關於否定~,可能值得將片轉換成密集的,因爲否定稀疏矩陣會給出(可能非常)密集的矩陣。在某些情況下,謹慎使用德摩根的法律可能會產生重大影響,並儘可能避免(或減少)此類轉換的需要。

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可能,但這是一個相當小的矩陣,使用密集矩陣實際上可能會更快。我想象一種可能出現在自然語言處理中的情境類型,其文檔術語矩陣可能容易達數百萬(例如推文)數千(單詞)。我還沒有嘗試,但在這種情況下,我認爲永遠不會轉變爲緻密差異。 –