मैं 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__
हमेशा कॉल किया जाएगा? दूसरा: क्या यह वांछित व्यवहार प्राप्त करने के बारे में जाने का सबसे अच्छा/आसान तरीका है?