我可以从未绑定成员方法创建Python Numpy ufunc吗?
我想用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 method f() must be called with Foo instance as first argument (got int instance instead)”,这个错误我能理解,因为Foo.f是没有绑定的。
虽然这个方法已经被弃用了,但我还是想试试new.instancemethod:
import new
Foo.h = new.instancemethod(numpy.frompyfunc(Foo.f,3,1),None,Foo)
j = Foo()
j.h(5,6,7)
这次最后一行出错了,提示信息是“TypeError: return arrays must be of ArrayType”,我对此不太明白。
我的目标是给Foo类添加一些可以直接使用ufunc的成员方法。它们必须是成员方法,因为它们依赖于Foo实例的状态(虽然这里没有展示这种依赖)。
有没有什么建议呢?
2 个回答
2
我得承认,我不太明白你为什么想把 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
0
给 Foo
添加一个 g
方法:
import numpy as np
class Foo(object):
def f(self,x,y,z):
return x + y + z
从 Foo
的一个实例中调用 g
方法:
def g(self,x,y,z):
return np.frompyfunc(self.f,3,1)(x,y,z)
Foo.g = g
i = Foo()
print(i.g(np.array([5,6]),np.array([6,7]),np.array([7,8])))
# [18 21]