math.exp
和numpy.exp
之间的区别之一是,如果您有一个具有C
方法的自定义类C.exp
,则numpy.exp
会注意到并委托给此方法,而math.exp
不会:
class C:
def exp(self):
return 'hey!'
import math
math.exp(C()) # raises TypeError
import numpy
numpy.exp(C()) # evaluates to 'hey!'
但是,如果您转到web documentation of numpy.exp
,这似乎是理所当然的。没有在任何地方明确说明。有记录此功能的地方吗?
更一般地说,是否有一个列表列出了numpy可以识别的 all 所有此类方法?
答案 0 :(得分:3)
这不是func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {}
函数的特殊行为;这只是评估对象dtype数组的结果。
np.exp
就像许多numpy函数一样,会在执行操作之前尝试将非数组输入转换为数组。
np.exp
因此In [227]: class C:
...: def exp(self):
...: return 'hey!'
...:
In [228]: np.exp(C())
Out[228]: 'hey!'
In [229]: np.array(C())
Out[229]: array(<__main__.C object at 0x7feb7154fa58>, dtype=object)
In [230]: np.exp(np.array(C()))
Out[230]: 'hey!'
被转换为一个数组,这是一个对象dtype *({C()
不是像C()
那样的可迭代对象)。通常,如果给定对象dtype数组,则numpy函数将在元素上进行迭代,要求每个元素执行相应的方法。这就解释了[228]如何最终评估[1,2,3]
。
C().exp()
In [231]: np.exp([C(),C()])
Out[231]: array(['hey!', 'hey!'], dtype=object)
In [232]: np.exp([C(),C(),2])
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-232-5010b59d525d> in <module>()
----> 1 np.exp([C(),C(),2])
AttributeError: 'int' object has no attribute 'exp'
可以在数组对象dtype上工作,前提是所有元素都具有np.exp
方法。整数不。 exp
也不是。
ndarray
In [233]: np.exp([C(),C(),np.array(2)])
AttributeError: 'numpy.ndarray' object has no attribute 'exp'
需要一个数字,一个Python标量(或可以转换为标量的东西,例如math.exp
。
我希望这种行为对所有人np.array(3)
都是普遍的。我不知道其他不遵循该协议的numpy函数。
在某些情况下,ufunc
委托给ufunc
方法:
__