как перегрузить numpy уфунки - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь написать программное обеспечение для распространения ошибок, которое работает с такими функциями, как np.sin(x) Я пытался реализовать свой собственный класс следующим образом:

class errör:
    def __init__(self,x,dx):
        self.x = x
        self.dx = dx

    def __add__(self,other):
        return "test"

    def __sin__(self):
        return "works"

, но когда я пытаюсь использовать это, я получаю:

>>> import numpy as np
>>> np.sin(a)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-15dfe0f9a21b> in <module>
----> 1 np.sin(a)

AttributeError: 'errör' object has no attribute 'sin'

почему он говорит мне, что у errör нет атрибута греха, когда он есть?

1 Ответ

1 голос
/ 10 января 2020

То, что вы видите, это то, как Python и массивы dtype объектов делегируют действия:

In [68]: class Foo(): 
    ...:     def __init__(self,val): 
    ...:         self.val = val 
    ...:     def __add__(self, other): 
    ...:         print('add') 
    ...:         return self.val + other 
    ...:     def sin(self): 
    ...:         print('sin') 
    ...:         return np.sin(self.val) 
    ...:     def __repr__(self): 
    ...:         return 'Foo {}'.format(self.val) 
    ...:                                                                        
In [69]: Foo(1)                                                                 
Out[69]: Foo 1
In [70]: Foo(1)+34                                                              
add
Out[70]: 35
In [71]: Foo(1)+Foo(2)                                                          
add
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-71-b4ac926529a7> in <module>
----> 1 Foo(1)+Foo(2)

<ipython-input-68-094444c1c787> in __add__(self, other)
      4     def __add__(self, other):
      5         print('add')
----> 6         return self.val + other
      7     def sin(self):
      8         print('sin')

TypeError: unsupported operand type(s) for +: 'int' and 'Foo'

Я не определил версию add, которая обрабатывает other объекты типа Foo .

Теперь для делегации sin:

In [72]: np.sin([Foo(1),Foo(2)])                                                
sin
sin
Out[72]: array([0.8414709848078965, 0.9092974268256817], dtype=object)

Массив Foo объектов:

In [73]: np.array([Foo(1),Foo(2)])                                                                        
Out[73]: array([Foo 1, Foo 2], dtype=object)
In [74]: np.array([Foo(1),Foo(2)])+1.23                                                                   
add
add
Out[74]: array([2.23, 3.23], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...