Почему numpy.angle() не является ufunc?
Почему numpy.angle()
не универсальная функция numpy (ufunc)?
Кажется, что он соответствует критериям для ufunc в документации numpy, но он не указан как единое целое.
Я думал, что это может не соответствовать определению, потому что оно преобразует тип числа (из сложного в реальное), но уже есть другие уфунки, которые делают это (например, np.absolute
).
Я сталкивался с этим, потому что я пытался применить np.angle
непосредственно в массив данных xarray DataArray, содержащий комплексные числа, и вместо массива данных DataArray он возвращает пустой массив. Я думаю, что это так, потому что это не тупой ufunc, и xarray проверяет это.
1 ответ
Полный код для np.angle
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
File: /usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py
Так что это тонкая оболочка Python для np.arctan2
, который является 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.