How To Pass Objects To Numpy Dot Function
Suppose I have defined my object: import numpy as np class myTensor: def __init__(self,data): self.data=np.array(data) self.parent=[] How can I pass 'myTensor'
Solution 1:
check the tutorial on how to write custom array container: https://numpy.org/devdocs/user/basics.dispatch.html
from numbers import Number
import numpy as np
HANDLED_FUNCTIONS = {}
classMytensor():
def__init__(self, data):
self.data = np.array(data)
self.parents = []
def__repr__(self):
returnf'Tensor: {self.data}'def__array_ufunc__(self, ufunc, method, *inputs, **kwargs):
if method == '__call__':
scalars = []
forinputin inputs:
ifisinstance(input, Number):
scalars.append(input)
elifisinstance(input, self.__class__):
scalars.append(input.data)
else:
returnNotImplemented
output = self.__class__(ufunc(*scalars, **kwargs))
output.parents.extend(scalars)
return output
else:
returnNotImplementeddef__array_function__(self, func, types, args, kwargs):
if func notin HANDLED_FUNCTIONS:
returnNotImplementedifnotall(issubclass(t, self.__class__) for t in types):
returnNotImplementedreturn HANDLED_FUNCTIONS[func](*args, **kwargs)
defimplements(np_function):
defdecorator(func):
HANDLED_FUNCTIONS[np_function] = func
return func
return decorator
@implements(np.dot)defdot(t1: Mytensor, t2: Mytensor):
output = Mytensor(np.dot(t1.data, t2.data))
output.parents.extend([t1, t2])
return output
You can now run np.exp or np.dot and returns an Tensor object:
if __name__ == '__main__':
t1 = Mytensor([[1, 2], [3, 4]])
t2 = Mytensor([[5, 6], [7, 8]])
output1 = np.exp(t1)
print(f'result: {output1}')
print(f'parents: {output1.parents}')
output2 = np.dot(t1, t2)
print(f'result: {output2}')
print(f'parents: {output2.parents}')
Post a Comment for "How To Pass Objects To Numpy Dot Function"