Can I create a Python Numpy ufunc from an unbound member method?
我想使用numpy.frompyfunc从未绑定的成员方法生成未绑定的ufunc。我的具体但失败的尝试看起来像
1 2 3 4 5 6 7 | class Foo(object): def f(x,y,z): return x + y + z Foo.g = numpy.frompyfunc(Foo.f,3,1) i = Foo() i.g(5,6,7) |
最后一行失败"typeError:必须使用foo实例作为第一个参数调用未绑定的方法f()(改为使用int实例)"。这个错误对我来说是有意义的,因为foo.f是未绑定的。
尽管它被弃用了,但我还是想尝试一下new.instancemethod:
1 2 3 4 | import new Foo.h = new.instancemethod(numpy.frompyfunc(Foo.f,3,1),None,Foo) j = Foo() j.h(5,6,7) |
当最后一行出现故障时,"typeerror:返回数组必须是arrayType",我不明白。
我的目标是用支持ufunc的成员版本来修补foo。它们必须是成员方法,因为它们依赖于foo实例的状态(尽管此处未显示该依赖关系)。
有什么建议吗?
我必须承认,我不太明白为什么你希望f和g在foo类中,但以下是可行的:
1 2 3 4 5 6 7 8 9 | >>> class Foo(object): ... @staticmethod ... def f(x, y, z): ... return x+y+z ... >>> Foo.g = numpy.frompyfunc(Foo.f, 3, 1) >>> i = Foo() >>> i.g(5, 6, 7) 18 |
编辑:由于您希望在方法中使用实例数据,因此实际需要的是绑定方法:
1 2 3 4 5 6 7 8 | >>> class Foo(object): ... def f(self, x, y, z): ... return x+y+z ... >>> i = Foo() >>> i.g = numpy.frompyfunc(i.f, 3, 1) >>> i.g(5, 6, 7) 18 |
当然,在真正的代码中,您可能希望在
1 2 3 4 5 6 7 8 9 | >>> class Foo(object): ... def __init__(self): ... self.g = numpy.frompyfunc(self.f, 3, 1) ... def f(self, x, y, z): ... return x+y+z ... >>> i = Foo() >>> i.g(5, 6, 7) 18 |
1 2 3 4 5 | import numpy as np class Foo(object): def f(self,x,y,z): return x + y + z |
在
1 2 3 | def g(self,x,y,z): return np.frompyfunc(self.f,3,1)(x,y,z) Foo.g = g |
从
1 2 3 | i = Foo() print(i.g(np.array([5,6]),np.array([6,7]),np.array([7,8]))) # [18 21] |