2014-06-25 4 views
7

मैं एक पुनरावर्तनीय से एक numpy सरणी बनाना चाहता हूं, जो डेटाबेस क्वेरी जैसे मानों के tuples पैदा करता है।आप एक बहुआयामी numpy सरणी कैसे tuples के पुनरावृत्त से बनाते हैं?

तो जैसा:

data = db.execute('SELECT col1, col2, col3, col4 FROM data') 
A = np.array(list(data)) 

वहाँ एक रास्ता तेजी से ऐसा करने के लिए, पहले एक सूची iterable परिवर्तित किए बिना की रास्ता नहीं है?

+0

यह सुनिश्चित नहीं करता कि यह काम करता है: http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromiter.html – Fabricator

+1

@ फ़ैब्रिकेटर प्रलेखन कहता है कि यह एक * 1 डी * सरणी को पुन: प्रयोज्य बनाता है। इस मामले में यह 4 कॉलम के साथ 2 डी सरणी के बजाय ऑब्जेक्ट्स की एक सरणी बना देगा। – Bakuriu

+0

'np.loadtxt' एक सरणी, अर्थात् एक फ़ाइल से सरणी बनाने का एक उदाहरण है। सरलीकृत शब्दों में, यह एक रेखा पढ़ता है, इसकी सबस्ट्रिंग से एक सूची बनाता है, और इसे एक सूची में जोड़ता है। अंत में यह सूचियों की सूची को सरणी में बदल देता है। – hpaulj

उत्तर

1

हालांकि तकनीकी रूप से नहीं मेरे प्रश्न का उत्तर, मैं मैं क्या करने की कोशिश कर रहा हूँ करने के लिए एक रास्ता मिल गया:

def get_cols(db, cols): 
    def get_col(col): 
     data = db.execute('SELECT '+col+' FROM data', dtype=np.float64) 
     return np.fromiter((v[0] for v in data)) 

    return np.vstack([get_col(col) for col in cols]).T 
+0

क्या यह कोई तेज है? – hpaulj

1

मैं numpy की एक अनुभवी उपयोगकर्ता नहीं हूँ, लेकिन यहाँ के लिए एक संभव समाधान है सामान्य प्रश्न:

>>> i = iter([(1, 11), (2, 22)]) 
>>> i 
<listiterator at 0x5b2de30>     # a sample iterable of tuples 
>>> rec_array = np.fromiter(i, dtype='i4,i4') # mind the dtype 
>>> rec_array         # rec_array is a record array 
array([(1, 11), (2, 22)], 
    dtype=[('f0', '<i4'), ('f1', '<i4')]) 
>>> rec_array['f0'], rec_array[0]    # each field has a default name 
(array([1, 2]), (1, 11)) 
>>> a = rec_array.view(np.int32).reshape(-1,2) # let's create a view 
>>> a 
array([[ 1, 11], 
     [ 2, 22]]) 
>>> rec_array[0][1] = 23 
>>> a           # a is a view, not a copy! 
array([[ 1, 23], 
     [ 2, 22]]) 

मुझे लगता है कि सभी कॉलम एक ही प्रकार के हैं, अन्यथा rec_array पहले से ही आप चाहते हैं।

अपने विशेष मामले के बारे में, मैं पूरी तरह से समझ नहीं पा रहा हूं कि आपके उदाहरण में db क्या है। यदि यह एक कर्सर ऑब्जेक्ट है, तो आप केवल fetchall विधि को कॉल कर सकते हैं और टुपल्स की एक सूची प्राप्त कर सकते हैं। ज्यादातर मामलों में, डेटाबेस लाइब्रेरी आंशिक रूप से पढ़ा गया क्वेरी परिणाम नहीं रखना चाहती है, प्रत्येक कोड को आपके कोड प्रोसेसिंग की प्रतीक्षा कर रही है, जो उस समय तक है जब execute विधि लौटाती है, सभी डेटा पहले से ही एक सूची में संग्रहीत है, और शायद ही कभी cursor इंस्टेंस करने के बजाय fetchall का उपयोग करने की समस्या।

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