2015-06-09 6 views
7

मेरे पास मिश्रित डेटा प्रकारों के साथ एक सूची, my_list है, जिसे मैं एक numpy सरणी में परिवर्तित करना चाहता हूं। हालांकि, मुझे त्रुटि TypeError: expected a readable buffer object मिलती है। नीचे कोड देखें। मैंने NumPy documentation पर अपना कोड बेस करने का प्रयास किया है।मिश्रित डेटा प्रकारों के साथ सूची के लिए नकली डाइप

my_list = [['User_0', '2012-2', 1, 6, 0, 1.0], ['User_0', '2012-2', 5, 6, 0, 1.0], ['User_0', '2012-3', 0, 0, 4, 1.0]] 
my_np_array = np.array(my_list, dtype='S30, S8, i4, i4, f32') 

उत्तर

11

dtype=object का उपयोग क्यों नहीं करते?

In [1]: my_list = [['User_0', '2012-2', 1, 6, 0, 1.0], ['User_0', '2012-2', 5, 
6, 0, 1.0], ['User_0', '2012-3', 0, 0, 4, 1.0]] 
In [2]: my_np_array = np.array(my_list, dtype=object) 
In [3]: my_np_array 
Out[3]: 
array([['User_0', '2012-2', 1, 6, 0, 1.0], 
     ['User_0', '2012-2', 5, 6, 0, 1.0], 
     ['User_0', '2012-3', 0, 0, 4, 1.0]], dtype=object) 

नोट यह स्मृति के उपयोग के बारे में है, जब आप प्रत्येक स्तंभ के dtype निर्दिष्ट करते हैं, स्मृति के लिए आवंटित अपने ndarray जब आप dtype=object जो अजगर में हर संभव प्रकार के होते हैं इसलिए स्मृति के लिए आवंटित का उपयोग से कम होगी प्रत्येक कॉलम अधिकतम होगा।

+0

प्रत्येक डेटाटाइप निर्दिष्ट 'dtype = object' बनाम उपयोग करने के पेशेवरों और विपक्ष क्या हैं? – pir

+0

@felbo मैंने अपना जवाब संपादित किया :) – farhawa

5

आपका नेस्टेड आइटम tuple भी आप एक i4 अपने प्रकार में छोड़े गए किया जाना चाहिए:

>>> my_np_array = np.array(map(tuple,my_list), dtype='|S30, |S8, i4, i4, i4, f32') 
>>> my_np_array 
array([('User_0', '2012-2', 1, 6, 0, 1.0), 
     ('User_0', '2012-2', 5, 6, 0, 1.0), 
     ('User_0', '2012-3', 0, 0, 4, 1.0)], 
     dtype=[('f0', 'S30'), ('f1', 'S8'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<f4')]) 

जहां तक ​​है के बाद से numpy उपयोग tuples उसके प्रकार बनाए रखने के लिए जब आप सरणी मदों के लिए कई प्रकार के उपयोग आपको अपने उप सरणी को dtype तत्वों की तरह टुपल करने की आवश्यकता है।

+1

हां, एक संरचना सरणी के लिए डेटा (इस तरह के जटिल प्रकार) को टुपल्स की एक सूची माना जाता है। डेटा वास्तव में tuples के रूप में संग्रहीत नहीं है, लेकिन उन्होंने इनपुट और प्रदर्शन के लिए tuple नोटेशन चुना है। यह nd arrays के लिए उपयोग की जाने वाली सूचियों की सामान्य सूची से अलग है। – hpaulj

+0

@ hpaulj दरअसल। ऐसा ही है! – Kasramvd

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