2013-07-31 17 views
6

के साथ अच्छी तरह से नहीं खेलता है, मैं एक numpy ndarray subclass करने की कोशिश कर रहा हूं, लेकिन मैं अन्य numpy प्रकारों जैसे मास्क किए गए सरणी या मैट्रिक्स के साथ संचालन सही करने में सक्षम नहीं हूँ। मुझे लगता है कि __array_priority__ सम्मानित नहीं किया जा रहा है।numpy सरणी से व्युत्पन्न वर्ग मैट्रिक्स और मुखौटा सरणी

import numpy as np 

class C(np.ndarray): 

    __array_priority__ = 15.0 

    def __mul__(self, other): 
     print("__mul__") 
     return 42 

    def __rmul__(self, other): 
     print("__rmul__") 
     return 42 

मेरी कक्षा और सामान्य ndarray काम के बीच संचालन की उम्मीद के रूप में: एक उदाहरण के रूप में, मैं एक डमी वर्ग कि महत्वपूर्ण पहलुओं mimicks बनाया है

>>> c1 = C((3, 3)) 
>>> o1 = np.ones((3, 3)) 
>>> print(o1 * c1) 
__mul__ 
42 
>>> print(c1 * o1) 
__rmul__ 
42 

लेकिन, जब मैं काम करने के लिए कोशिश मैट्रिक्स (या मुखौटा सरणी) के साथ सरणी प्राथमिकता का सम्मान नहीं किया जाता है।

>>> m = np.matrix((3, 3)) 
>>> print(c1 * m) 
__mul__ 
42 
>>> print(m * c1) 
Traceback (most recent call last): 
... 
    File "/usr/lib64/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 330, in __mul__ 
    return N.dot(self, asmatrix(other)) 
ValueError: objects are not aligned 

मुझे ऐसा लगता है कि जिस तरह से ufuncs मैट्रिक्स और नकाबपोश सरणियों के लिए लिपटे रहे हैं सरणी प्राथमिकता का सम्मान नहीं करते। क्या यह मामला है? क्या आसपास कोई काम है?

+1

वास्तव में, त्रुटि संदेश क्योंकि वे गठबंधन नहीं कर रहे हैं दी जाती है, 'np.matrix के बाद से ((3, 3)) '' np.asmatrix (np.ones ((3, 3)) के समान नहीं है)। हालांकि, समस्या अभी भी बनी हुई है कि 'एम * सी 1' वह काम है जो काम नहीं कर रहा है। –

+0

@ गुस्तावर्ससन इसे ढूंढने के लिए धन्यवाद। मैंने इसे ठीक किया और प्रेरणा में और जानकारी जोड़ दी। – Hernan

उत्तर

2

एक वैकल्पिक हल np.matrixib.defmatrix.matrix उपवर्ग के लिए है:

class C(np.matrixlib.defmatrix.matrix): 

    __array_priority__ = 15.0 

    def __mul__(self, other): 
     print("__mul__") 
     return 42 

    def __rmul__(self, other): 
     print("__rmul__") 
     return 4 

इस मामले में प्राथमिकता भी अधिक तो एक np.ndarray और अपने गुणन तरीकों हमेशा कहा जाता है है।

टिप्पणी में जोड़ने पर, आपको इस मामले में कई वर्गों से उपवर्ग कर सकते हैं आप की जरूरत अंतर:

class C(np.matrixlib.defmatrix.matrix, np.ndarray): 
+0

यह अच्छी तरह से काम करता है, लेकिन मेरी कक्षाएं बेहतर ढंग से मैट्रिक्स की तुलना में ndarray द्वारा वर्णित हैं। इसके अतिरिक्त, मेरी कक्षा को अंडारे, मैट्रिक्स और मास्कड डार्रे के साथ इंटरऑपरेट करना चाहिए। क्या इसको हासिल करने के लिए कोई रास्ता है? – Hernan

+0

इस दृष्टिकोण का उपयोग करने का प्रयास करें और देखें कि क्या इंटरऑपरेशन हासिल किया गया है, यदि नहीं, तो आप एक से अधिक कक्षाओं से उपclass कर सकते हैं, जैसे: 'कक्षा सी (np.matrixlib.defmatrix.matrix, np.ndarray):', उदाहरण के लिए। .. –

+0

मैंने कक्षा को 'कक्षा सी (np.matrixlib.defmatrix.matrix, np.ma.core.MaskedArray, np.ndarray) के रूप में फिर से परिभाषित किया है: '। यह बदसूरत है लेकिन ऐसा लगता है, मुझे अभी भी अधिक परीक्षण मामलों की आवश्यकता है। अब मैं एक वर्ग के लिए ऐसा करने की कोशिश कर रहा हूं जो एक सरणी को लपेटता है (उपclassing के बिना)। फिर, यह ठीक काम करता है जब एक ndarray द्वारा multipliying लेकिन किसी और के लिए नहीं। – Hernan