2010-06-24 14 views
6

मैं scipy.sparse.lil_matrix का उपयोग कर एक बड़े, स्पैस (250k एक्स 250k) सह-घटना मैट्रिक्स बनाने के लिए Scipy का उपयोग कर रहा हूं। सह-घटना मैट्रिस त्रिकोणीय हैं; वह है, एम [मैं, जे] == एम [जे, मैं]। चूंकि यह सभी डेटा दो बार स्टोर करने के लिए अत्यधिक अक्षम (और मेरे मामले में, असंभव) होगा, मैं वर्तमान में समन्वय (i, j) पर डेटा संग्रहीत कर रहा हूं जहां मैं हमेशा जे से छोटा रहता हूं। तो दूसरे शब्दों में, मेरे पास एक मूल्य (2,3) पर संग्रहीत है और (3,2) पर संग्रहीत कोई मूल्य नहीं है, भले ही मेरे मॉडल में (3,2) बराबर (2,3) होना चाहिए। (उदाहरण के लिए नीचे मैट्रिक्स देखें)Scipy sparse त्रिकोणीय मैट्रिक्स?

मेरी समस्या यह है कि मुझे किसी दिए गए इंडेक्स से संबंधित डेटा को यादृच्छिक रूप से निकालने में सक्षम होना चाहिए, लेकिन कम से कम जिस तरह से, मैं वर्तमान में इसे कर रहा हूं, आधा डेटा पंक्ति में है और आधा तो की तरह, कॉलम में है:

M = 
    [1 2 3 4 
    0 5 6 7 
    0 0 8 9 
    0 0 0 10] 

तो, ऊपर मैट्रिक्स को देखते हुए, मैं M[1] की तरह एक प्रश्न करते हैं, और वापस [2,5,6,7] प्राप्त करने में सक्षम होना चाहता हूँ। मेरे पास दो प्रश्न हैं:

1) क्या पंक्ति को पहले पूछताछ करने के बाद और फिर कॉलम, और फिर दो को जोड़कर ऐसा करने के लिए एक और अधिक कुशल (अधिमानतः अंतर्निहित) तरीका है? यह बुरा है क्योंकि क्या मैं सीएससी (कॉलम-आधारित) या सीएसआर (पंक्ति-आधारित) आंतरिक प्रतिनिधित्व का उपयोग करता हूं, दो प्रश्नों में से एक बेहद अक्षम है।

2) क्या मैं सिसि के सही हिस्से का भी उपयोग कर रहा हूं? मैंने सिसि लाइब्रेरी में कुछ फ़ंक्शंस देखे हैं जो त्रिभुज मैट्रिक्स का उल्लेख करते हैं, लेकिन वे पूर्ण मैट्रिक्स से त्रिकोणीय मैट्रिस प्राप्त करने के आसपास घूमते प्रतीत होते हैं। मेरे मामले में, (मुझे लगता है) मेरे पास पहले से ही एक त्रिकोणीय मैट्रिक्स है, और इसे कुशल बनाना चाहते हैं।

बहुत धन्यवाद।

+1

इसे त्रिकोणीय ऊपरी पैक भंडारण फ़िया कहा जाता है। मुझे नहीं लगता कि पूरे कॉलम या पंक्ति को त्रिभुज मैट्रिक्स से प्राप्त करने के कुशल तरीके हैं। – Anycorn

+2

'एम [i, j] == एम [जे, मैं] 'का अर्थ है कि मैट्रिक्स सममित है, त्रिकोणीय नहीं है। – EOL

+0

@EOL अच्छा बिंदु। हालांकि विकिपीडिया परिभाषा के अनुसार, यह मैट्रिक्स भी (ऊपरी) त्रिभुज है। – gilesc

उत्तर

1

मैं कहूंगा कि आप केक नहीं ले सकते हैं और इसे भी खा सकते हैं: यदि आप कुशल भंडारण चाहते हैं, तो आप पूरी पंक्तियों को स्टोर नहीं कर सकते हैं (जैसा कि आप कहते हैं); यदि आप कुशल पंक्ति पहुंच चाहते हैं, तो मैं कहूंगा कि आपको पूर्ण पंक्तियां स्टोर करनी होंगी।

वास्तविक प्रदर्शन आपके आवेदन पर निर्भर करते हैं, तब तक आप जांच कर सकता है निम्नलिखित दृष्टिकोण आप के लिए काम करता है या नहीं:

  1. आप कुशल भंडारण के लिए Scipy's sparse matrices का उपयोग करें।

  2. आप स्वचालित रूप से अपने मैट्रिक्स को सममित करते हैं (स्टैक ओवरफ्लो पर small recipe है, जो कम से कम नियमित मैट्रिक्स पर काम करता है)।

  3. तब आप अपनी पंक्तियों (या कॉलम) तक पहुंच सकते हैं; चाहे यह कुशल है स्पैर मैट्रिस के कार्यान्वयन पर निर्भर करता है ...

+0

मुझे इससे डर था। हालांकि धन्यवाद। – gilesc

संबंधित मुद्दे