我正在尝试使用在Numpy v1.11文档中这里解释的
__numpy_ufunc__()
方法,来覆盖ndarray
子类上numpy ufunc的行为,但它似乎从未被调用。尽管这种用例在指南中列出,但我找不到任何实际使用__numpy_ufunc__()
的示例。有人尝试过吗?这是一个最简示例:# Check python version
import sys
print(sys.version)
3.5.1 |Continuum Analytics, Inc.| (默认值,2016年6月15日,15:32:45)
[GCC 4.4.7 20120313(Red Hat 4.4.7-1)
# Check numpy version
import numpy as np
print(np.__version__)
1.11.2
# Subclass ndarray as discussed in
# https://docs.scipy.org/doc/numpy/user/basics.subclassing.html
class Function(np.ndarray):
# Create subclass object by view
def __new__(cls):
obj = np.asarray([1,2,3]).view(cls)
return obj
# I'm not even adding anything functionality yet
def __array_finalize(self,obj): pass
# Override ufuncs
def __numpy_ufunc__(ufunc, method, i, inputs, **kwargs):
print("In PF __numpy_ufunc__")
# do other stuff here if I want to
# and probably need to return a value...
# Create two Functions
f1=Function()
f2=Function()
# Check that they are correctly initialized as Function objects
# not just ndarrays
print(type(f1),type(f2))
⟨class 'main.Function'⟩ ⟨class 'main.Function'⟩
# Add using operator
f1+f2
函数([2, 4, 6])
# Add, explicitly demanding a numpy ufunc
np.add(f1,f2)
Function([2, 4, 6])
很明显,子类化起作用了,并且在幕后使用numpy添加数组。 我正在使用足够新的numpy版本来使用__numpy_ufunc__()功能(根据文档页面,它是v1.11中的新功能)。 但是此代码从未打印出"In PF __numpy_ufunc__"。 为什么?
self
参数或者说明这应该是一个staticmethod
或classmethod
。 - user2357112ndarray
没有自己的__numpy_ufunc__
,所以你可能不应该尝试通过super
来调用它。 - user2357112super
行,因为我不想让这个问题变得混乱。 - Sam Bader