Могу ли я создать Python Numpy ufunc из метода несвязанного члена? - PullRequest
0 голосов
/ 25 мая 2011

Я хотел бы использовать 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: необязательный метод 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», который я не понимаю.

Моя цель состоит в том, чтобы обезопасить Foo с версиями его членов, готовыми к ufunc.Они должны быть методами-членами, так как они зависят от состояния экземпляра Foo (хотя эта зависимость здесь не показана).

Есть предложения?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Я должен признать, что я не совсем понимаю, почему вы хотите, чтобы 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

РЕДАКТИРОВАТЬ: так как вы хотите использовать данные экземплярав вашем методе вам действительно нужен метод bound :

>>> 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

Конечно, в реальном коде вы, вероятно, захотите присвоить g в Foo.__init__, а не внекласс:

>>> 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 голосов
/ 05 июня 2011
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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...