2010-02-28 5 views
20

मैं एक numpy सरणी बना रहा हूं जो कि मैंने बनाए गए किसी विशेष वर्ग की वस्तुओं से भरा हुआ है। मैं सरणी को प्रारंभ करना चाहता हूं जैसे कि इसमें केवल उस वर्ग की वस्तुएं होंगी। उदाहरण के लिए, मैं यहां क्या करना चाहता हूं, और अगर मैं ऐसा करता हूं तो क्या होता है।numpy arrays में कस्टम डेटा प्रकार

class Kernel: 
    pass 

>>> L = np.empty(4,dtype=Kernel) 

TypeError: data type not understood 

मैं यह कर सकता:

>>> L = np.empty(4,dtype=object) 

और फिर एक Kernel वस्तु (या वस्तु के किसी भी अन्य प्रकार) के रूप में L के प्रत्येक तत्व आवंटित। यह बहुत साफ होगा कि मैं Kernel एस की एक सरणी प्राप्त कर सकता हूं, हालांकि, एक प्रोग्रामिंग बिंदु दृश्य (प्रकार की जांच) और गणितीय एक (कार्यों के सेट पर संचालन) दोनों से।

क्या मनमाने ढंग से कक्षा का उपयोग करके एक numpy सरणी के डेटा प्रकार को निर्दिष्ट करने का कोई तरीका है?

http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#arrays-scalars-built-in

या ndarray का एक उपवर्ग:

उत्तर

18

यदि आपके कर्नेल क्लास में सदस्य डेटा की अनुमानित राशि है, तो आप कक्षा के बजाय इसके लिए एक प्रकार टाइप कर सकते हैं। जैसे अगर यह 9 तैरता और एक पूर्णांक द्वारा parameterized है, तुम कर सकते हो

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)]) 
arr = np.empty(dims, dtype=kerneldt) 

आप वर्ग कर्नेल की वस्तुओं में हर बार जब आप एक भी गिरी के तरीकों हेरफेर करना चाहते उन्हें चालू करने के कुछ बलात्कार करना होगा लेकिन वह है एक एक NumPy सरणी में वास्तविक डेटा स्टोर करने के लिए रास्ता। यदि आप केवल संदर्भ को संग्रहित करना चाहते हैं, तो ऑब्जेक्ट डाइटपे सबसे अच्छा है जिसे आप बिना सब्सक्राइब किए बिना कर सकते हैं।

+0

यही वह है जिसे मैं ढूंढ रहा था! हालांकि मुझे लगता है कि यह इसके लायक होने से बहुत अधिक काम है ... np.dtype पर पढ़ा जाएगा। –

1

जहाँ तक मुझे पता है, में तत्वों के लिए एक ही प्रकार को लागू करने एक numpy.ndarray मैन्युअल रूप से किया जाना चाहिए (जब तक सरणी में Numpy scalars शामिल नहीं है): कोई अंतर्निहित जांच तंत्र नहीं है (आपकी सरणी dtype = वस्तु है)। यदि आप वास्तव में एक प्रकार को लागू करना चाहते हैं, तो आपको उचित तरीकों (__setitem__ इत्यादि) में चेक को लागू करना होगा और चेक को लागू करना होगा।

यदि आप कार्यों के एक सेट (कर्नेल ऑब्जेक्ट्स) पर संचालन को कार्यान्वित करना चाहते हैं, तो आप सीधे अपने कर्नेल क्लास में उचित संचालन को परिभाषित करके ऐसा करने में सक्षम हो सकते हैं। यह मैंने अपने uncertainties.py मॉड्यूल के लिए किया है, जो अनिश्चितताओं के साथ संख्याओं के numpy.ndarrays संभालती है।