2012-05-24 9 views
12

पर कॉलम नाम जोड़ें, मैं एक numpy ndarray में कॉलम नाम जोड़ने की कोशिश कर रहा हूं, फिर उनके नाम से कॉलम का चयन करें। लेकिन यह काम नहीं करता है। मैं यह नहीं बता सकता कि समस्या तब होती है जब मैं नाम जोड़ता हूं, या बाद में जब मैं उन्हें कॉल करने का प्रयास करता हूं।प्रोग्रामेटिक रूप से numpy ndarray

मेरा कोड यहां है।

print len(csv_names) 
>> 108 
print data.shape 
>> (1652, 108) 

"प्रिंट data.dtype.names" भी अपेक्षित आउटपुट देता है:

data = np.genfromtxt(csv_file, delimiter=',', dtype=np.float, skip_header=1) 

#Add headers 
csv_names = [ s.strip('"') for s in file(csv_file,'r').readline().strip().split(',')] 
data = data.astype(np.dtype([(n, 'float64') for n in csv_names])) 

आयाम आधारित निदान मैं क्या उम्मीद से मेल खाते हैं।

लेकिन जब मैं अपने क्षेत्र के नाम से कॉलम कॉल करना शुरू करता हूं, तो खराब चीजें होती हैं। "कॉलम" अभी भी 108 कॉलम के साथ एक सरणी

print data["EDUC"].shape 
>> (1652, 108) 

है ... ... और इसे और अधिक लापता मूल्यों को रोकने के लिए की तुलना में वहाँ डेटा सेट में पंक्तियों हैं प्रकट होता है।

print np.sum(np.isnan(data["EDUC"])) 
>> 27976 

कोई विचार क्या गलत हो रहा है? हेडर जोड़ना एक मामूली ऑपरेशन होना चाहिए, लेकिन मैं घंटों के लिए इस बग से लड़ रहा हूं। मदद!

उत्तर

13

समस्या यह है कि आप, स्प्रेडशीट की तरह सरणियों के मामले में सोच रहे हैं, जबकि अंक पीई विभिन्न अवधारणाओं का उपयोग करता है।

यहाँ आप NumPy के बारे में क्या पता होना चाहिए है:

  1. NumPy सरणी के केवल एक ही प्रकार का के तत्व होते हैं।
  2. यदि आपको स्प्रेडशीट की तरह "कॉलम" की आवश्यकता है, तो यह प्रकार कुछ टुपल-जैसा प्रकार होना चाहिए। इस तरह के सरणी को संरचित Arrays कहा जाता है, क्योंकि उनके तत्व संरचनाएं हैं (यानी tuples)।

आपके मामले में, NumPy इस प्रकार आपके 2-आयामी नियमित सरणी लेने के लिए और एक एक आयामी सरणी जिसका प्रकार 108 तत्व टपल है उत्पादन होगा (स्प्रेडशीट सरणी है कि आप के बारे में सोच रहे हैं 2-आयामी है)।

ये विकल्प शायद दक्षता कारणों से किए गए थे: किसी सरणी के सभी तत्वों का एक ही प्रकार होता है और इसलिए एक ही आकार होता है: उन्हें निम्न स्तर पर, बहुत आसानी से और जल्दी से एक्सेस किया जा सकता है।

अब, उपयोगकर्ता 545424 के रूप में दिखाया गया है कि आप जो करना चाहते हैं उसके लिए एक सरल NumPy उत्तर है (genfromtxt() कॉलम नामों के साथ names तर्क स्वीकार करता है)।

आप एक संरचित सरणी के लिए एक नियमित NumPy ndarray से अपने सरणी में परिवर्तित करना चाहते हैं, तो आप कर सकते हैं:

data.view(dtype=[(n, 'float64') for n in csv_names]).reshape(len(data)) 

(आप करीब थे: आप view() के बजाय astype() प्रयुक्त)।

आप Converting a 2D numpy array to a structured array और how to convert regular numpy array to record array? समेत कुछ स्टैक ओवरफ्लो प्रश्नों के उत्तर भी देख सकते हैं।

+0

धन्यवाद - यह अवधारणाओं को स्पष्ट रूप से स्पष्ट करने में मदद करता है। लेकिन मुझे अभी भी इस विशेष मामले के बारे में कुछ सवाल हैं। यहां, मेरे सभी कॉलम फ़्लोट हैं, और मैं बहुत सारे मैट्रिक्स गुणा करने जा रहा हूं, इसलिए मैं 2 डी-सरणी संरचना रखना चाहता हूं - संरचित सरणी की आवश्यकता नहीं है। मैं बस इतना करना चाहता हूं कि फील्ड नाम जोड़ें। क्या यह संभव है? – Abe

+0

एनबी: genfromtxt numpy के संरचित tuple प्रारूप में csv आयात करता है। मैंने सरणी प्रारूप में फील्ड नाम आयात करने के बारे में सोचने के बारे में सोचने की कोशिश की, और कुछ भी काम नहीं किया। – Abe

+0

@ एबे: आप अभी भी मैट्रिक्स गुणात्मक प्रदर्शन कर सकते हैं: 'व्यू()' * * * डेटा को देखने का एक और तरीका है। तो, आप एक ही समय में मूल डेटा सरणी और 'व्यू()' एड सरणी दोनों के साथ काम कर सकते हैं (पहला सरणी 2 डी है, दूसरा 1 डी है और संरचित)। – EOL

2

दुर्भाग्य से, मैं पता नहीं क्या जब आप फ़ील्ड नामों को जोड़ने का प्रयास चल रहा है, लेकिन मुझे पता है कि आप के माध्यम से

data = np.genfromtxt(csv_file, delimiter=',', names=True) 

संपादित सरणी फ़ाइल से आप सीधे चाहते हैं का निर्माण कर सकते हैं:

यह फ़ील्ड नाम जोड़ने की तरह लगता है केवल जब इनपुट tuples की एक सूची है काम करता है:

data = np.array(map(tuple,data), [(n, 'float64') for n in csv_names]) 
+0

तो क्या यह मामला है कि अगर उन्हें ट्यूपल्स के रूप में डाला जाता है या क्षेत्र आईडी द्वारा संदर्भित किया जाता है तो इन्हें फ़ील्ड नामों द्वारा संदर्भित किया जा सकता है --- लेकिन दोनों कभी नहीं? ऐसा लगता है कि यह काम करता है, लेकिन मुझे दस्तावेज में ऐसा कुछ नहीं दिख रहा है। – Abe

+0

मुझे आश्चर्य है कि यह एक बग है या नहीं। आपके द्वारा पास की गई नेस्टेड संरचना के प्रकार के आधार पर सरणी कन्स्ट्रक्टर अलग-अलग कार्य करने के लिए यह बहुत अजीब व्यवहार है। – user545424

+0

@ user545424: यदि आप उन सिद्धांतों को जानते हैं जिन पर NumPy आधारित है (आप उदाहरण के लिए मेरे उत्तर की जांच कर सकते हैं)। संक्षेप में: tuple() एक प्रकार का "मौलिक प्रकार" (फ्लोट्स की तरह) है, NumPy के लिए (इसलिए जब आप tuples पास करते हैं तो आपको एक प्रकार का संरचित सरणी मिलता है), जबकि इनपुट के रूप में उत्तीर्ण सूचियों या सरणी का अर्थ है "एक और आयाम जोड़ें "सरणी में (आपको संख्याओं की सरणी मिलती है, आमतौर पर)। – EOL