问题描述
|
我想使用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:必须以Foo实例作为第一个参数来调用未绑定的方法f()(改为使用int实例)\”。这个错误对我来说很有意义,因为Foo.f是不受限制的。
尽管已弃用,但我还是想尝试一下new.instance方法:
import new
Foo.h = new.instancemethod(numpy.frompyfunc(Foo.f,1),None,Foo)
j = Foo()
j.h(5,7)
现在,最后一行失败并带有\“ TypeError:返回数组必须为ArrayType \”,我不明白。
我的目标是为猴子提供Fufunc-ready版本的补丁。它们必须是成员方法,因为它们取决于Foo实例的状态(尽管此处未显示该依赖关系)。
有什么建议么?
解决方法
import numpy as np
class Foo(object):
def f(self,x,y,z):
return x + y + z
在Foo
中添加g
方法:
def g(self,z):
return np.frompyfunc(self.f,3,1)(x,z)
Foo.g = g
从Foo
实例调用g
:
i = Foo()
print(i.g(np.array([5,6]),np.array([6,7]),np.array([7,8])))
# [18 21]
,我必须承认,我不太了解为什么要让f和g进入Foo类,但是可以使用以下方法:
>>> class Foo(object):
... @staticmethod
... def f(x,z):
... return x+y+z
...
>>> Foo.g = numpy.frompyfunc(Foo.f,1)
>>> i = Foo()
>>> i.g(5,6,7)
18
编辑:由于您想在方法中使用实例数据,因此您实际需要的是绑定方法:
>>> class Foo(object):
... def f(self,z):
... return x+y+z
...
>>> i = Foo()
>>> i.g = numpy.frompyfunc(i.f,1)
>>> i.g(5,7)
18
当然,在实际代码中,您可能希望在Foo.__init__
中分配g,而不是在类之外:
>>> class Foo(object):
... def __init__(self):
... self.g = numpy.frompyfunc(self.f,1)
... def f(self,z):
... return x+y+z
...
>>> i = Foo()
>>> i.g(5,7)
18