2013-01-24 12 views
8

मेरे पास बूलियन मानों से भरे स्पैर मैट्रिस का एक सेट है जिसे मुझे लॉजिकल ऑपरेशंस (ज्यादातर तत्व-वार या) पर करने की आवश्यकता है।scipy.sparse matrices पर बूलियन ऑपरेशंस

numpy के रूप में, dtype = 'bool' के साथ मैट्रिक्स संक्षेप देता तत्व के लिहाज से या, लेकिन वहाँ एक बुरा पक्ष प्रभाव है:

>>> from scipy import sparse 
>>> [a,b] = [sparse.rand(5,5,density=0.1,format='lil').astype('bool') 
... for x in range(2)] 
>>> b 
<5x5 sparse matrix of type '<class 'numpy.bool_'>' 
    with 2 stored elements in LInked List format> 
>>> a+b 
<5x5 sparse matrix of type '<class 'numpy.int8'>' 
    with 4 stored elements in Compressed Sparse Row format> 

डेटा प्रकार 'int8' में बदल दिया जाता है, जिसकी वजह से भविष्य के संचालन के लिए समस्याएं। यह कह कर के साथ चारों ओर हो गया हो सकता है:

(a+b).astype('bool') 

लेकिन मैं धारणा है कि यह सभी प्रकार के बदलते एक प्रदर्शन हिट का कारण होगा मिलता है।

परिणाम का प्रकार टाइप ऑपरेटरों से अलग क्यों है?
और क्या अजगर में स्पैर मैट्रिस पर तार्किक संचालन करने का एक बेहतर तरीका है?

उत्तर

5

लॉजिकल ऑपरेशंस स्पैर मैट्रिस के लिए समर्थित नहीं हैं, लेकिन वापस 'बूल' में कनवर्ट करना महंगा नहीं है। असल में, लील प्रारूप मैट्रिक्स का उपयोग कर तो वह रूपांतरण प्रदर्शन उतार चढ़ाव के कारण नकारात्मक समय लेने के लिए दिखाई दे सकते हैं:

a = scipy.sparse.rand(10000, 10000, density=0.001, format='lil').astype('bool') 
b = scipy.sparse.rand(10000, 10000, density=0.001, format='lil').astype('bool') 

In [2]: %timeit a+b 
10 loops, best of 3: 61.2 ms per loop 

In [3]: %timeit (a+b).astype('bool') 
10 loops, best of 3: 60.4 ms per loop 

आपने ध्यान दिया होगा कि आपके LIL मैट्रिक्स सीएसआर प्रारूप में परिवर्तित किया गया उन्हें एक साथ जोड़ने से पहले, वापसी पर देखने के प्रारूप। आप पहले से ही सीएसआर प्रारूप का उपयोग कर के साथ शुरू किया गया था, तो रूपांतरण भूमि के ऊपर अधिक ध्यान देने योग्य हो जाता है:

In [14]: %timeit a+b 
100 loops, best of 3: 2.28 ms per loop 

In [15]: %timeit (a+b).astype(bool) 
100 loops, best of 3: 2.96 ms per loop 

सीएसआर (और सीएससी) मैट्रिक्स एक data विशेषता है जो एक -1 डी सरणी है कि वास्तविक गैर शून्य प्रविष्टियों रखती है स्पैर मैट्रिक्स का, इसलिए आपके स्पैर मैट्रिक्स को पुन: स्थापित करने की लागत आपके मैट्रिक्स की गैर-शून्य प्रविष्टियों की संख्या पर निर्भर करेगी, इसका आकार नहीं:

a = scipy.sparse.rand(10000, 10000, density=0.0005, format='csr').astype('int8') 
b = scipy.sparse.rand(1000, 1000, density=0.5, format='csr').astype('int8') 

In [4]: %timeit a.astype('bool') # a is 10,000x10,000 with 50,000 non-zero entries 
10000 loops, best of 3: 93.3 us per loop 

In [5]: %timeit b.astype('bool') # b is 1,000x1,000 with 500,000 non-zero entries 
1000 loops, best of 3: 1.7 ms per loop 
संबंधित मुद्दे