我想使用numpy.frompyfunc从未绑定的成员方法生成未绑定的ufunc。我的具体但失败的尝试看起来像
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:unbound方法f()必须使用Foo实例作为第一个参数调用(改为使用int实例)”。这个错误对我有意义,因为Foo.f是未绑定的。
尽管它被弃用了,我还以为我会给new.instance方法一个镜头:
import new
Foo.h = new.instancemethod(numpy.frompyfunc(Foo.f,3,1),None,Foo)
j = Foo()
j.h(5,6,7)
现在最后一行失败了“TypeError:返回数组必须是ArrayType”我不明白。
我的目标是使用ufunc-ready版本的成员来修补补丁Foo。它们必须是成员方法,因为它们依赖于Foo实例的状态(尽管此处未显示该依赖项)。
有什么建议吗?
答案 0 :(得分:1)
我必须承认,我不太明白你为什么要f和g进入Foo类,但以下工作:
>>> 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
编辑:既然您想在方法中使用实例数据,那么您实际需要的是一个绑定方法:
>>> 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
当然,在实际代码中,您可能希望在Foo.__init__
中分配g,而不是在课外:
>>> 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 :(得分:0)
import numpy as np
class Foo(object):
def f(self,x,y,z):
return x + y + z
向g
添加Foo
方法:
def g(self,x,y,z):
return np.frompyfunc(self.f,3,1)(x,y,z)
Foo.g = g
从g
的实例中调用Foo
:
i = Foo()
print(i.g(np.array([5,6]),np.array([6,7]),np.array([7,8])))
# [18 21]