为什么 numpy.angle() 不是 ufunc?
Why is numpy.angle() not a ufunc?
为什么 numpy.angle()
不是 numpy 通用函数 (ufunc)?
它似乎符合 numpy documentation 中 ufunc 的标准,但它没有被列为一个。
我认为它可能不符合定义,因为它会转换数字的类型(从复数到实数),但已经有其他 ufunc 可以做到这一点(例如 np.absolute
)。
我遇到这个是因为我试图将 np.angle
直接应用于包含复数的 xarray DataArray,它 returns 是一个 numpy 数组而不是 xarray DataArray。我认为它这样做是因为它不是一个 numpy ufunc,而 xarray 会检查它。
np.angle
的完整代码(来自 numpy GitHub repo)
def angle(z, deg=0):
if deg:
fact = 180/pi
else:
fact = 1.0
z = asarray(z)
if (issubclass(z.dtype.type, _nx.complexfloating)):
zimag = z.imag
zreal = z.real
else:
zimag = 0
zreal = z
return arctan2(zimag, zreal) * fact
所以它是 np.arctan2
的薄 python 包装器,它是 ufunc
。
一种猜测是,没有人认为它需要成为一个 ufunc,或者没有人有兴趣将其转换为 ufunc。
https://docs.scipy.org/doc/numpy-1.15.1/reference/c-api.ufunc.html
https://docs.scipy.org/doc/numpy-1.15.1/reference/c-api.generalized-ufuncs.html
https://docs.scipy.org/doc/numpy-1.15.0/user/c-info.ufunc-tutorial.html
在我看来,直接使用 np.arctan2
会简单得多,使用你自己的复杂 dtype 数组的精简包装器。
为什么 numpy.angle()
不是 numpy 通用函数 (ufunc)?
它似乎符合 numpy documentation 中 ufunc 的标准,但它没有被列为一个。
我认为它可能不符合定义,因为它会转换数字的类型(从复数到实数),但已经有其他 ufunc 可以做到这一点(例如 np.absolute
)。
我遇到这个是因为我试图将 np.angle
直接应用于包含复数的 xarray DataArray,它 returns 是一个 numpy 数组而不是 xarray DataArray。我认为它这样做是因为它不是一个 numpy ufunc,而 xarray 会检查它。
np.angle
的完整代码(来自 numpy GitHub repo)
def angle(z, deg=0):
if deg:
fact = 180/pi
else:
fact = 1.0
z = asarray(z)
if (issubclass(z.dtype.type, _nx.complexfloating)):
zimag = z.imag
zreal = z.real
else:
zimag = 0
zreal = z
return arctan2(zimag, zreal) * fact
所以它是 np.arctan2
的薄 python 包装器,它是 ufunc
。
一种猜测是,没有人认为它需要成为一个 ufunc,或者没有人有兴趣将其转换为 ufunc。
https://docs.scipy.org/doc/numpy-1.15.1/reference/c-api.ufunc.html
https://docs.scipy.org/doc/numpy-1.15.1/reference/c-api.generalized-ufuncs.html
https://docs.scipy.org/doc/numpy-1.15.0/user/c-info.ufunc-tutorial.html
在我看来,直接使用 np.arctan2
会简单得多,使用你自己的复杂 dtype 数组的精简包装器。