2017-04-24 9 views
6

मेरे पास तत्वों की एक साधारण सूची है और मैं इसे structured array बनाने की कोशिश कर रहा हूं।किसी सूची से एक संरचित सरणी बनाना

यह अनुभवहीन दृष्टिकोण में विफल रहता है:

y = np.array([1,2,3], dtype=[('y', float)]) 
TypeError: expected an object with a buffer interface 

एक टपल में प्रत्येक तत्व लाना काम करता है:

# Manuel way 
y = np.array([(1,), (2,), (3,)], dtype=[('y', float)]) 
# Comprehension 
y = np.array([tuple((x,)) for x in [1,2,3]], dtype=[('y', float)]) 

यह भी अगर मैं सूची में से एक सरणी बनाने के पहले काम करता है:

y = np.array(np.array([1,2,3]), dtype=[('y', float)]) 

मैं थोड़ा परेशान हूँ। उत्तरार्द्ध कैसे काम करता है लेकिन numpy एक साधारण सूची प्रदान करते समय चीजों को हल नहीं कर सका?

अनुशंसित तरीका क्या है? उस इंटरमीडिएट array का निर्माण करने का कोई शानदार प्रदर्शन प्रभाव नहीं हो सकता है, लेकिन यह उप-शीर्ष नहीं है?

मैं भी हैरान हूँ कि उन काम नहीं करेगा हूँ:

# All lists 
y = np.array([[1,], [2,], [3,]], dtype=[('y', float)]) 
TypeError: expected an object with a buffer interface 
# All tuples 
y = np.array(((1,), (2,), (3,)), dtype=[('y', float)]) 
ValueError: size of tuple must match number of fields. 

मैं संरचित सरणियों के लिए नया हूँ और मैं numpy याद नहीं है कि इनपुट प्रकार बारे में चयन किया जा रहा है। मुझे कुछ याद आना चाहिए।

+0

क्योंकि पंक्तियाँ, tuples का उपयोग कर को सौंपा जा सकता है क्योंकि एक संरचित सरणी के प्रत्येक तत्व एक * struct * है, इसलिए वहाँ यौगिक डेटाप्रकार किसी तरह का है। विकल्प एक बफर का उपयोग करना है (यही कारण है कि 'np.array' काम करता है)। –

+0

यह दस्तावेज की तरह है [यहां] (https://docs.scipy.org/doc/numpy/user/basics.rec.html#filling- संरचित-arrays) –

+0

और पिछले दस्तावेज़ अनुच्छेद में उल्लेख किया गया है कि एक्स है tuples की एक सूची के साथ बनाया गया। '। यह इनपुट शैली प्रदर्शन शैली से मेल खाती है। मैं आपकी सूची समझ दृष्टिकोण पसंद करता हूं। या क्षेत्र द्वारा एक preallocated सरणी फ़ील्ड भरना। – hpaulj

उत्तर

3

विवरण np.array संकलित कोड में विभिन्न इनपुट को दफन किया गया है। ऑब्जेक्ट डाइट ऐरे बनाने के बारे में कई प्रश्न दिखाते हैं, यह जटिल और भ्रमित हो सकता है। मूल मॉडल एक नेस्टेड सूची से बहुआयामी संख्यात्मक सरणी बनाना है।

np.array([[1,2,3],[4,5,6]]) 

संरचित सरणियों को लागू करने, डेवलपर्स सिर्फ एक और नेस्टेड आयाम से एक रिकार्ड भेद के तरीके के रूप tuple अपनाया। यह एक संरचित सरणी के प्रदर्शन में स्पष्ट है।

संरचित सरणी को परिभाषित करते समय भी एक आवश्यकता है, हालांकि list of tuples आवश्यकता दस्तावेज में कुछ हद तक दफन की गई है।

In [382]: dt=np.dtype([('y',int)]) 
In [383]: np.array(alist,dt) 

TypeError: a bytes-like object is required, not 'int' 

यह मेरा संस्करण '1.12.0' त्रुटि संदेश है। यह आपके में अलग दिखता है।

जैसा कि आप ध्यान देते हैं कि एक सूची समझ घोंसला सूची को टुपल्स की सूची में परिवर्तित कर सकती है।

In [384]: np.array([tuple(i) for i in alist],dt) 
Out[384]: 
array([(1,), (2,), (3,)], 
     dtype=[('y', '<i4')]) 

SO प्रश्नों का उत्तर देने में यह दृष्टिकोण है जिसका मैं अक्सर उपयोग करता हूं। या तो उस या पुनरावर्तित सरणी के फ़ील्ड सेट करें (आमतौर पर फ़ील्ड की तुलना में बहुत अधिक रिकॉर्ड होते हैं, ताकि लूप महंगा न हो)।

यह एक संरचित सरणी कॉल में सरणी लपेटकर की तरह दिखता है एक astype कॉल के बराबर है:

In [385]: np.array(np.array(alist),dt) 
Out[385]: 
array([[(1,)], 
     [(2,)], 
     [(3,)]], 
     dtype=[('y', '<i4')]) 
In [386]: np.array(alist).astype(dt) 
Out[386]: 
array([[(1,)], 
     [(2,)], 
     [(3,)]], 
     dtype=[('y', '<i4')]) 

लेकिन आयाम की संख्या में परिवर्तन पर ध्यान दें। Tuples की सूची एक (3,) सरणी बनाई। astype ने (3,1) संख्यात्मक सरणी को एक (3,1) संरचित सरणी में परिवर्तित किया।

टुपल्स np.array बताते हैं कि भाग सरणी आयामों और अभिलेखों के बीच विभाजन को यहां रखा गया है।यह व्याख्या

[(3,), (1,), (2,)] 
[record, record, record] 

जहां [[1],[2],[3]] के स्वचालित अनुवाद

[[record],[record],[record]] 

उत्पादन हो सकता है जब dtype सांख्यिक (गैर संरचित) यह सूची और टपल

In [388]: np.array([tuple(i) for i in alist],int) 
Out[388]: 
array([[1], 
     [2], 
     [3]]) 

लेकिन बीच के अंतर पर ध्यान नहीं देता है के रूप में जब टाइप प्रकार कंपाउंड होता है, डेवलपर्स ने ट्यूपल लेयर को महत्वपूर्ण जानकारी के रूप में उपयोग करना चुना है।


एक अधिक जटिल संरचना वाले dtype

In [389]: dt1=np.dtype([('y',int,(2,))]) 
In [390]: np.ones((3,), dt1) 
Out[390]: 
array([([1, 1],), ([1, 1],), ([1, 1],)], 
     dtype=[('y', '<i4', (2,))]) 
In [391]: np.array([([1,2],),([3,4],)]) 
Out[391]: 
array([[[1, 2]], 

     [[3, 4]]]) 
In [392]: np.array([([1,2],),([3,4],)], dtype=dt1) 
Out[392]: 
array([([1, 2],), ([3, 4],)], 
     dtype=[('y', '<i4', (2,))]) 

प्रदर्शन (और इनपुट) सूची के भीतर tuples भीतर सूचियों है पर विचार करें। और यह बस एक शुरुआत है

In [393]: dt1=np.dtype([('x',dt,(2,))]) 
In [394]: dt1 
Out[394]: dtype([('x', [('y', '<i4')], (2,))]) 
In [395]: np.ones((2,),dt1) 
Out[395]: 
array([([(1,), (1,)],), ([(1,), (1,)],)], 
     dtype=[('x', [('y', '<i4')], (2,))]) 

convert list of tuples to structured numpy array

+0

इस व्यापक उत्तर के लिए धन्यवाद। यह अब और अधिक समझ में आता है। मैं थोड़ा आश्चर्यचकित था, जैसा कि मेरे मामूली अनुभव से, numpy "I'm-a-sciist-with-no-python-background-and-I-can-do-numpy" आसान था, कुछ आश्चर्य के साथ, और ऐसा प्रतीत होता है संरचित सरणी में हेरफेर करने के लिए अंदर क्या होता है इसके बारे में अधिक सावधानी और समझ की आवश्यकता होती है। –

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