Python 了解自定义数组容器的numpy.log和numpy.sum之间的差异

Python 了解自定义数组容器的numpy.log和numpy.sum之间的差异,python,numpy,Python,Numpy,我通过以下方式为NumPy数组创建自定义容器。我编写了以下代码: 创建一个类,NpContainer 定义函数np.sum和np.log的自定义行为以输出字符串 将numpy导入为np 已处理的函数={} NPC类容器: 定义初始值(self,val): self.val=val 定义数组(自): 返回np.array(self.val) 定义数组函数(self、func、type、args、kwargs): 如果func不在已处理函数中: 引发未实现的错误() 返回处理的函数[func](

我通过以下方式为NumPy数组创建自定义容器。我编写了以下代码:

  • 创建一个类,
    NpContainer
  • 定义函数
    np.sum
    np.log
    的自定义行为以输出字符串
将numpy导入为np
已处理的函数={}
NPC类容器:
定义初始值(self,val):
self.val=val
定义数组(自):
返回np.array(self.val)
定义数组函数(self、func、type、args、kwargs):
如果func不在已处理函数中:
引发未实现的错误()
返回处理的函数[func](*args,**kwargs)
def执行(np_功能):
def装饰器(func):
已处理的函数[np\U函数]=func
返回函数
返回装饰器
@实现(np.sum)
定义金额(a,**千瓦格):
返回'Sum Val:{}'。格式(np.Sum(a.Val,**kwargs))
@实现(np.log)
def日志(a,**kwargs):
返回'logval:{}'。格式(np.Log(a,**kwargs))
我使用以下方法测试代码:

如果名称=“\uuuuu main\uuuuuuuu”:
container1=NpContainer(val=np.array([1,2.]))
sum_结果=np.sum(容器1)
打印(总和结果)
打印(类型(总和结果))
log_result=np.log(container1)
打印(记录结果)
打印(类型(记录结果))
Sum产生预期的结果

Sum Val: 3.0
<class 'str'>

有人知道为什么
np.log
跳过我的自定义函数吗?感谢您的帮助

好吧,我想——我知道发生了什么。您实现了函数
\uuuuu数组\uuuuu函数
,它应该适合
np.sum
,但是对于
np.log
,您应该执行
\uuuuuu数组\uuuuunc\uuuuuu
,因为它是一个通用函数()

这里有更多的风味,我建议您在这里查看:

现在奇怪的是,一旦实现了
\uuuuuuunc\uuuunc
,甚至
np.sum
也将被处理为
ufunc
,这会弄乱
装饰程序

ufunc
np.sum
np.add
,因此下面将为您提供一些技巧-尽管我更建议将
sum()
作为
NpContainer
的函数来实现,这样您就可以改为
container1.sum()

将numpy导入为np
已处理的函数={}
NPC类容器:
定义初始值(self,val):
self.val=val
定义数组(自):
返回np.array(self.val)
定义数组函数(self、func、type、args、kwargs):
如果func不在已处理函数中:
引发未实现的错误()
返回处理的函数[func](*args,**kwargs)
def _数组uuunc u_(self,ufunc,method,*args,**kwargs):
如果ufunc不在处理函数中:
引发未实现的错误()
返回处理的函数[ufunc](*args,**kwargs)
def执行(np_功能):
def装饰器(func):
已处理的函数[np\U函数]=func
返回函数
返回装饰器
@实现(np.add)
定义金额(a,**千瓦格):
返回'Sum Val:{}'。格式(np.Sum(a.Val,**kwargs))
@实现(np.log)
def日志(a,**kwargs):
返回'logval:{}'。格式(np.Log(a.Val,**kwargs))
如果名称=“\uuuuu main\uuuuuuuu”:
container1=NpContainer(val=np.array([1,2.]))
log_result=np.log(container1)
打印(记录结果)
打印(类型(记录结果))
sum_结果=np.sum(容器1)
打印(总和结果)
打印(类型(总和结果))

您希望看到返回的是什么?我的意思是
sum
对所有元素求和,
log
从所有元素获取日志?我希望它返回
log Val:[0.0.69314718]
。它似乎忽略了我自定义的日志函数(请参见
@implements(np.log)
np.log
是一个
ufunc
(如
np.add
np.multiply
)。您需要定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!你和@GrzegorzSkibinski一针见血!哇!谢谢你的详细回复。这是完美的,我绝对同意您的建议,实施
container1.sum()
,尤其是在阅读了第二个链接中关于
\uuuu数组\u函数的警告之后。
[0.         0.69314718]
<class 'numpy.ndarray'>