2011-03-29 15 views
7

लौटाता है मेरे पास एक सरणी उपclass है, जहां कुछ अतिरिक्त विशेषताओं केवल वस्तु के मूल आकार के लिए मान्य हैं। क्या यह सुनिश्चित करने का कोई तरीका है कि सभी सरणी आकार बदलने वाले ऑपरेशंस मेरी कक्षा के उदाहरण के बजाय एक सामान्य numpy सरणी लौटाते हैं?एक numpy सरणी subclass बनाना जहां सभी आकार बदलते संचालन एक सामान्य सरणी

मैं पहले से ही array_wrap लिखा है, लेकिन इस np.mean, np.sum या np.rollaxis जैसे कार्य पर कोई असर दिखाई नहीं देता। ये सब सिर्फ मेरी कक्षा का एक उदाहरण लौटाते हैं।

import numpy as np  

class NewArrayClass(np.ndarray): 
    __array_priority__ = 3.0 
    def __array_wrap__(self, out_arr, context=None): 
     if out_arr.shape == self.shape: 
      out = out_arr.view(new_array) 
      # Do a bunch of class dependant initialization and attribute copying. 
      # ... 
      return out 
     else: 
      return np.asarray(out_arr) 

A = np.arange(10) 
A.shape = (5, 2) 
A = arr.view(NewArrayClass) 
# Would like this to be np.ndarray, but get new_array_class. 
print type(np.sum(A, 0)) 

मैं समझ रहा __new__ या __array_finalize__ में कुछ करने के लिए है, लेकिन मैं एक सुराग क्या नहीं किया है।

अद्यतन: ध्यान से उपवर्गीकरण (http://docs.scipy.org/doc/numpy/user/basics.subclassing.html) पर numpy प्रलेखन पढ़ने के बाद, सभी सरणी आकार बदलने के आपरेशन 'नया टेम्पलेट से' आपरेशन कर रहे हैं। तो प्रश्न बन जाता है, आप मेरी कक्षा के उदाहरणों के बजाय 'टेम्पलेट से नया' ऑपरेशन रिटर्न ndarray उदाहरण कैसे बनाते हैं। जहां तक ​​मैं कह सकता हूं, __new__ इन कार्यों के भीतर कभी नहीं कहा जाता है।

वैकल्पिक: ऊपर मान लिया जाये कि संभव नहीं है, कैसे मैं कम से कम __array_finalize__ टेम्पलेट आपरेशन (के रूप में कास्टिंग देखने के खिलाफ) से नए में पहचान करते हैं? यह कम से कम मुझे कुछ विशेषताओं को संदर्भित करने देगा जो संदर्भ द्वारा प्रतिलिपि बनाई गई हैं। मैं एक नया ध्वज बता सकता हूं कि नया आकार बता रहा है कि इसका आकार अमान्य है।

उत्तर

1

यदि आप अपने NewArrayClass उदाहरणों में कोई नया सदस्य नहीं पेश कर रहे हैं, तो आप लौटाए गए उदाहरणों के __class__ विशेषता को पुन: असाइन कर सकते हैं।

A.__class__ = np.ndarray 

मुद्दा यह है कि आप ऐसा क्यों करना चाहते हैं। क्या आप कहीं और सख्त प्रकार की जांच में संलग्न हैं? आप बतख टाइपिंग के साथ कहीं ज्यादा जाना होगा।

+0

मेरे पास मेरी कक्षा में विधियों का एक समूह है जो सरणी गलत आकार होने पर अपवाद उठाएगा। मैं इन तरीकों को अप्राप्य बनाना चाहता हूं। – kiyo

+0

तो वर्णित विधि आपके लिए काम कर सकती है। 'NewArrayClass' द्वारा पेश की गई विधियां संशोधित' __class__' के साथ किसी भी तरह से लागू नहीं होंगी। – janislaw

+0

मुझे नहीं लगता कि आपको सी एक्सटेंशन में परिभाषित कक्षाओं के साथ ऐसा करने की अनुमति है, जैसे 'np.ndarray'। मुझे 'TypeError: __class__ असाइनमेंट मिलता है: केवल ढेर प्रकारों के लिए। –

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