我可以从未绑定的成员方法创建python numpy ufunc吗?

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

当然,在真正的代码中,您可能希望在Foo.__init__中分配g,而不是在类之外:

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

Foo中增加一个g方法:

1
2
3
def g(self,x,y,z):
    return np.frompyfunc(self.f,3,1)(x,y,z)
Foo.g = g

Foo的实例调用g

1
2
3
i = Foo()
print(i.g(np.array([5,6]),np.array([6,7]),np.array([7,8])))
# [18 21]