Python 了解自定义数组容器的numpy.log和numpy.sum之间的差异
我通过以下方式为NumPy数组创建自定义容器。我编写了以下代码: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](
- 创建一个类,
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'>