2012-05-04 10 views
5

मैं numpy के ndarray कक्षा को उपclass करने की कोशिश कर रहा हूं, और कुछ भाग्य प्राप्त किया है। जो व्यवहार मैं चाहता हूं वह लगभग example दस्तावेज में दिया गया है। मैं सरणी में name पैरामीटर जोड़ना चाहता हूं (जिसका उपयोग मैं ट्रैक करता हूं कि डेटा कहां से आया था)।एक परिवर्तन के दौरान वापसी मूल्य के रूप में एक numpy ndarray subclass रखना। __array_priority__ सेट करने के लिए सुरक्षित?

class Template(np.ndarray): 
    """A subclass of numpy's n dimensional array that allows for a 
    reference back to the name of the template it came from. 
    """ 
    def __new__(cls, input_array, name=None): 
     obj = np.asarray(input_array).view(cls) 
     obj.name = name 
     return obj 

    def __array_finalize__(self, obj): 
     if obj is None: return 
     self.name = getattr(obj, 'name', None) 

यह काम करता है, सिवाय इसके कि, this question की तरह, मैं अपने उपवर्ग से जुड़े मेरी उपवर्ग का एक और उदाहरण वापस जाने के लिए किसी भी परिवर्तन चाहते हैं।

कभी कभी numpy कार्यों Template का एक उदाहरण लौट कार्य करें:

>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here') 
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]])) 
Template([[1, 2, 3], 
     [2, 4, 6]]) 

लेकिन, कभी कभी वे नहीं है:

>>> np.dot(np.array([[1,0],[0,1]]), a) 
array([[1, 2, 3], 
     [2, 4, 6]]) 

सवाल मैं ऊपर से जुड़ा हुआ में, यह सुझाव दिया गया कि ओ पी subclass के लिए __wrap_array__ विधि ओवरराइड करना चाहिए। हालांकि, मुझे इसमें कोई औचित्य नहीं दिख रहा है। कुछ स्थितियों में, मुझे अपना अपेक्षित व्यवहार डिफ़ॉल्ट __array_wrap__ के साथ मिल रहा है। इनपुट के

ध्यान दें कि ufunc (np.add) का आह्वान किया है __array_wrap__ विधि: The docs है कि मैं एक स्थिति है जहाँ यह अन्य तर्क के __array_wrap__ विधि एक उच्च __array_priority__ मूल्य की वजह से बुलाया जा रहा है में चल रहा हूँ सुझाव देने के लिए लग रहे हैं उच्चतम __array_priority__ मूल्य

तो मेरे प्रश्न में कुछ संबंधित भाग हैं। पहला: क्या मैं अपने सबक्लास के __array_priority__ विशेषता को सेट कर सकता हूं जैसे कि __array_wrap__ हमेशा कॉल किया जाएगा? दूसरा: क्या यह वांछित व्यवहार प्राप्त करने के बारे में जाने का सबसे अच्छा/आसान तरीका है?

उत्तर

0

दो वस्तुओं एक ही __array_priority__ है जब:

>>> np.array([[1,0],[0,1]]).__array_priority__ 
0.0 
>>> a.__array_priority__ 
0.0 

और केवल एक ही वस्तु के तरीकों का इस्तेमाल किया जा सकता है, टाई पहली सरणी के/वस्तु के तरीकों का उपयोग करके हल हो गई है। (आपके मामले में __array_wrap__)

प्रश्न से ऐसा लगता है कि आपकी कक्षा के तरीकों को हमेशा पसंद किया जाना चाहिए, क्योंकि वे वही हैं (विरासत के माध्यम से) या ओवरराइड।

तो मैं सिर्फ __array_priority__ को क्रैंक कर दूंगा।

class Template(np.ndarray): 
    __array_priority__ = 1.0 (Or whichever value is high enough) 
    ... 

ऐसा करने के बाद कोई फर्क नहीं पड़ता कि टेम्पलेट ऑब्जेक्ट गणना में है। मानक सरणी विधियों पर इसकी विधियों को प्राथमिकता दी जाएगी।