2012-11-12 54 views
16

SciPy Sparse Matrix tutorial बहुत अच्छा है - लेकिन यह वास्तव में विकसित (एआर) विकसित करने के लिए अनुभाग छोड़ देता है (अभी भी रूपरेखा रूप में - अनुभाग देखें: "स्पैर मैट्रिस हैंडलिंग")।Scipy में स्प्लिस मैट्रिसेस स्लाइसिंग - कौन से प्रकार सर्वश्रेष्ठ काम करते हैं?

इस प्रश्न का उत्तर देने के बाद, मैं ट्यूटोरियल को आजमाऊंगा और अपडेट करूँगा।

मेरे पास एक बड़ा स्पैस मैट्रिक्स है - वर्तमान में dok_matrix प्रारूप में।

import numpy as np 
from scipy import sparse 
M = sparse.dok_matrix((10**6, 10**6)) 

विभिन्न तरीकों के लिए मैं स्तंभों को टुकड़ा करने में सक्षम होना चाहता हूं और दूसरों के लिए मैं पंक्तियों को टुकड़ा करना चाहता हूं। आदर्श रूप में मैं एक विरल मैट्रिक्स M काट करने के लिए उन्नत अनुक्रमण (यानी एक बूलियन वेक्टर, bool_vect) जिसके साथ प्रयोग करेंगे - के रूप में:

bool_vect = np.arange(10**6)%2 # every even index 
out = M[bool_vect,:]   # Want to select every even row 

या

out = M[:,bool_vect] # Want to select every even column 

पहले, dok_matrices का समर्थन नहीं करते यह - लेकिन मुझे लगता है कि यह पहली बार lil_matrices पर काम करता है, sparse.lil_matrix(M)

जहां तक ​​मैं ट्यूटोरियल से एकत्र कर सकता हूं - कॉलम स्लाइस करने के लिए मैं सीएससी का उपयोग करना चाहता हूं और पंक्तियों को टुकड़ा करना चाहता हूं टुकड़ा सीएसआर।

M.tocsc()[:,bool_vect] 

या

M.tocsr()[bool_vect,:] 

मैं थोड़े यहाँ अनुमान लगा रहा हूँ और मेरी कोड है क्योंकि यह की धीमी है: तो है कि मैं के माध्यम से मैट्रिक्स M डाली चाहिए मतलब है। किसी ऐसे व्यक्ति से कोई मदद जो समझती है कि यह कैसे काम करता है। अग्रिम में धन्यवाद।

यदि यह पता चला है कि मुझे एक बूलियन सरणी के साथ अपने मैट्रिक्स को अनुक्रमणित नहीं किया जाना चाहिए, बल्कि पूर्णांक (इंडेक्स) की एक सूची - यह भी कुछ है जो मुझे ढूंढने में खुशी होगी। जो भी अधिक कुशल है।

अंत में - यह एक बड़ा मैट्रिक्स है, इसलिए यदि यह स्थान/प्रसारण के साथ हो सकता है तो बोनस अंक।

उत्तर

31

ठीक है, तो मुझे यकीन है कि ऐसा करने के लिए "सही" तरीका यह है: यदि आप कॉलम स्लाइस कर रहे हैं, तो intecs की सूची/सरणी का उपयोग करके tocsc() और टुकड़ा का उपयोग करें। बूलियन वेक्टर स्पैस मैट्रिस के साथ चाल नहीं लगते हैं - जिस तरह से यह अंधा में अंडाकारों के साथ करता है। जिसका मतलब है जवाब है।

indices = np.where(bool_vect)[0] 
out1 = M.tocsc()[:,indices] 
out2 = M.tocsr()[indices,:] 

लेकिन सवाल: क्या यह सबसे अच्छा तरीका है? क्या यह जगह में है?

प्रैक्टिस में ऐसा लगता है कि यह जगह में हो रहा है - और यह पूर्व प्रयासों (lil_matrix का उपयोग करके) से बहुत तेज है।

+0

यदि 'एम' एक प्रारूप है जिसमें अनुक्रमण (' coo' या 'dok') नहीं है तो यह रूपांतरण सही तरीका है। लेकिन अगर कॉलम इंडेक्सिंग करने के लिए 'एमएस' पहले से ही 'सीएससी' स्विचिंग कर रहा है तो यह इसके लायक नहीं हो सकता है। 'स्पैस' इंडेक्सिंग एक जटिल व्यवसाय है। – hpaulj