То, что вы видите, это то, как 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)