<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">"""This file contains information on how to translate different ufuncs
into numba. It is a database of different ufuncs and how each of its
loops maps to a function that implements the inner kernel of that ufunc
(the inner kernel being the per-element function).

Use the function get_ufunc_info to get the information related to the
ufunc
"""


import numpy as np
import sys

# this is lazily initialized to avoid circular imports
IS_WIN32 = sys.platform.startswith('win32')
numpy_version = tuple(map(int, np.__version__.split('.')[:2]))
_ufunc_db = None


def _lazy_init_db():
    global _ufunc_db

    if _ufunc_db is None:
        _ufunc_db = {}
        _fill_ufunc_db(_ufunc_db)


def get_ufuncs():
    """obtain a list of supported ufuncs in the db"""
    _lazy_init_db()
    return _ufunc_db.keys()


def get_ufunc_info(ufunc_key):
    """get the lowering information for the ufunc with key ufunc_key.

    The lowering information is a dictionary that maps from a numpy
    loop string (as given by the ufunc types attribute) to a function
    that handles code generation for a scalar version of the ufunc
    (that is, generates the "per element" operation").

    raises a KeyError if the ufunc is not in the ufunc_db
    """
    _lazy_init_db()
    return _ufunc_db[ufunc_key]


def _fill_ufunc_db(ufunc_db):
    # some of these imports would cause a problem of circular
    # imports if done at global scope when importing the numba
    # module.
    from numba.np import npyfuncs
    from numba.np.math import cmathimpl, mathimpl, numbers
    from numba.np.numpy_support import numpy_version

    ufunc_db[np.isnat] = {
        # datetime &amp; timedelta
        'M-&gt;?': npyfuncs.np_datetime_isnat_impl,
        'm-&gt;?': npyfuncs.np_datetime_isnat_impl,
    }

    ufunc_db[np.negative] = {
        '?-&gt;?': numbers.int_invert_impl,
        'b-&gt;b': numbers.int_negate_impl,
        'B-&gt;B': numbers.int_negate_impl,
        'h-&gt;h': numbers.int_negate_impl,
        'H-&gt;H': numbers.int_negate_impl,
        'i-&gt;i': numbers.int_negate_impl,
        'I-&gt;I': numbers.int_negate_impl,
        'l-&gt;l': numbers.int_negate_impl,
        'L-&gt;L': numbers.int_negate_impl,
        'q-&gt;q': numbers.int_negate_impl,
        'Q-&gt;Q': numbers.int_negate_impl,
        'f-&gt;f': numbers.real_negate_impl,
        'd-&gt;d': numbers.real_negate_impl,
        'F-&gt;F': numbers.complex_negate_impl,
        'D-&gt;D': numbers.complex_negate_impl,
    }

    ufunc_db[np.positive] = {
        '?-&gt;?': numbers.int_positive_impl,
        'b-&gt;b': numbers.int_positive_impl,
        'B-&gt;B': numbers.int_positive_impl,
        'h-&gt;h': numbers.int_positive_impl,
        'H-&gt;H': numbers.int_positive_impl,
        'i-&gt;i': numbers.int_positive_impl,
        'I-&gt;I': numbers.int_positive_impl,
        'l-&gt;l': numbers.int_positive_impl,
        'L-&gt;L': numbers.int_positive_impl,
        'q-&gt;q': numbers.int_positive_impl,
        'Q-&gt;Q': numbers.int_positive_impl,
        'f-&gt;f': numbers.real_positive_impl,
        'd-&gt;d': numbers.real_positive_impl,
        'F-&gt;F': numbers.complex_positive_impl,
        'D-&gt;D': numbers.complex_positive_impl,
    }

    ufunc_db[np.absolute] = {
        '?-&gt;?': numbers.int_abs_impl,
        'b-&gt;b': numbers.int_abs_impl,
        'B-&gt;B': numbers.uint_abs_impl,
        'h-&gt;h': numbers.int_abs_impl,
        'H-&gt;H': numbers.uint_abs_impl,
        'i-&gt;i': numbers.int_abs_impl,
        'I-&gt;I': numbers.uint_abs_impl,
        'l-&gt;l': numbers.int_abs_impl,
        'L-&gt;L': numbers.uint_abs_impl,
        'q-&gt;q': numbers.int_abs_impl,
        'Q-&gt;Q': numbers.uint_abs_impl,
        'f-&gt;f': numbers.real_abs_impl,
        'd-&gt;d': numbers.real_abs_impl,
        'F-&gt;f': numbers.complex_abs_impl,
        'D-&gt;d': numbers.complex_abs_impl,
    }

    ufunc_db[np.sign] = {
        'b-&gt;b': numbers.int_sign_impl,
        'B-&gt;B': numbers.int_sign_impl,
        'h-&gt;h': numbers.int_sign_impl,
        'H-&gt;H': numbers.int_sign_impl,
        'i-&gt;i': numbers.int_sign_impl,
        'I-&gt;I': numbers.int_sign_impl,
        'l-&gt;l': numbers.int_sign_impl,
        'L-&gt;L': numbers.int_sign_impl,
        'q-&gt;q': numbers.int_sign_impl,
        'Q-&gt;Q': numbers.int_sign_impl,
        'f-&gt;f': numbers.real_sign_impl,
        'd-&gt;d': numbers.real_sign_impl,
        'F-&gt;F': npyfuncs.np_complex_sign_impl,
        'D-&gt;D': npyfuncs.np_complex_sign_impl,
    }

    ufunc_db[np.add] = {
        '??-&gt;?': numbers.int_or_impl,
        'bb-&gt;b': numbers.int_add_impl,
        'BB-&gt;B': numbers.int_add_impl,
        'hh-&gt;h': numbers.int_add_impl,
        'HH-&gt;H': numbers.int_add_impl,
        'ii-&gt;i': numbers.int_add_impl,
        'II-&gt;I': numbers.int_add_impl,
        'll-&gt;l': numbers.int_add_impl,
        'LL-&gt;L': numbers.int_add_impl,
        'qq-&gt;q': numbers.int_add_impl,
        'QQ-&gt;Q': numbers.int_add_impl,
        'ff-&gt;f': numbers.real_add_impl,
        'dd-&gt;d': numbers.real_add_impl,
        'FF-&gt;F': numbers.complex_add_impl,
        'DD-&gt;D': numbers.complex_add_impl,
    }

    ufunc_db[np.subtract] = {
        '??-&gt;?': numbers.int_xor_impl,
        'bb-&gt;b': numbers.int_sub_impl,
        'BB-&gt;B': numbers.int_sub_impl,
        'hh-&gt;h': numbers.int_sub_impl,
        'HH-&gt;H': numbers.int_sub_impl,
        'ii-&gt;i': numbers.int_sub_impl,
        'II-&gt;I': numbers.int_sub_impl,
        'll-&gt;l': numbers.int_sub_impl,
        'LL-&gt;L': numbers.int_sub_impl,
        'qq-&gt;q': numbers.int_sub_impl,
        'QQ-&gt;Q': numbers.int_sub_impl,
        'ff-&gt;f': numbers.real_sub_impl,
        'dd-&gt;d': numbers.real_sub_impl,
        'FF-&gt;F': numbers.complex_sub_impl,
        'DD-&gt;D': numbers.complex_sub_impl,
    }

    ufunc_db[np.multiply] = {
        '??-&gt;?': numbers.int_and_impl,
        'bb-&gt;b': numbers.int_mul_impl,
        'BB-&gt;B': numbers.int_mul_impl,
        'hh-&gt;h': numbers.int_mul_impl,
        'HH-&gt;H': numbers.int_mul_impl,
        'ii-&gt;i': numbers.int_mul_impl,
        'II-&gt;I': numbers.int_mul_impl,
        'll-&gt;l': numbers.int_mul_impl,
        'LL-&gt;L': numbers.int_mul_impl,
        'qq-&gt;q': numbers.int_mul_impl,
        'QQ-&gt;Q': numbers.int_mul_impl,
        'ff-&gt;f': numbers.real_mul_impl,
        'dd-&gt;d': numbers.real_mul_impl,
        'FF-&gt;F': numbers.complex_mul_impl,
        'DD-&gt;D': numbers.complex_mul_impl,
    }

    if np.divide != np.true_divide:
        ufunc_db[np.divide] = {
            'bb-&gt;b': npyfuncs.np_int_sdiv_impl,
            'BB-&gt;B': npyfuncs.np_int_udiv_impl,
            'hh-&gt;h': npyfuncs.np_int_sdiv_impl,
            'HH-&gt;H': npyfuncs.np_int_udiv_impl,
            'ii-&gt;i': npyfuncs.np_int_sdiv_impl,
            'II-&gt;I': npyfuncs.np_int_udiv_impl,
            'll-&gt;l': npyfuncs.np_int_sdiv_impl,
            'LL-&gt;L': npyfuncs.np_int_udiv_impl,
            'qq-&gt;q': npyfuncs.np_int_sdiv_impl,
            'QQ-&gt;Q': npyfuncs.np_int_udiv_impl,
            'ff-&gt;f': npyfuncs.np_real_div_impl,
            'dd-&gt;d': npyfuncs.np_real_div_impl,
            'FF-&gt;F': npyfuncs.np_complex_div_impl,
            'DD-&gt;D': npyfuncs.np_complex_div_impl,
        }

    ufunc_db[np.true_divide] = {
        'bb-&gt;d': npyfuncs.np_int_truediv_impl,
        'BB-&gt;d': npyfuncs.np_int_truediv_impl,
        'hh-&gt;d': npyfuncs.np_int_truediv_impl,
        'HH-&gt;d': npyfuncs.np_int_truediv_impl,
        'ii-&gt;d': npyfuncs.np_int_truediv_impl,
        'II-&gt;d': npyfuncs.np_int_truediv_impl,
        'll-&gt;d': npyfuncs.np_int_truediv_impl,
        'LL-&gt;d': npyfuncs.np_int_truediv_impl,
        'qq-&gt;d': npyfuncs.np_int_truediv_impl,
        'QQ-&gt;d': npyfuncs.np_int_truediv_impl,
        'ff-&gt;f': npyfuncs.np_real_div_impl,
        'dd-&gt;d': npyfuncs.np_real_div_impl,
        'FF-&gt;F': npyfuncs.np_complex_div_impl,
        'DD-&gt;D': npyfuncs.np_complex_div_impl,
    }

    ufunc_db[np.floor_divide] = {
        'bb-&gt;b': npyfuncs.np_int_sdiv_impl,
        'BB-&gt;B': npyfuncs.np_int_udiv_impl,
        'hh-&gt;h': npyfuncs.np_int_sdiv_impl,
        'HH-&gt;H': npyfuncs.np_int_udiv_impl,
        'ii-&gt;i': npyfuncs.np_int_sdiv_impl,
        'II-&gt;I': npyfuncs.np_int_udiv_impl,
        'll-&gt;l': npyfuncs.np_int_sdiv_impl,
        'LL-&gt;L': npyfuncs.np_int_udiv_impl,
        'qq-&gt;q': npyfuncs.np_int_sdiv_impl,
        'QQ-&gt;Q': npyfuncs.np_int_udiv_impl,
        'ff-&gt;f': npyfuncs.np_real_floor_div_impl,
        'dd-&gt;d': npyfuncs.np_real_floor_div_impl,
    }

    ufunc_db[np.remainder] = {
        'bb-&gt;b': npyfuncs.np_int_srem_impl,
        'BB-&gt;B': npyfuncs.np_int_urem_impl,
        'hh-&gt;h': npyfuncs.np_int_srem_impl,
        'HH-&gt;H': npyfuncs.np_int_urem_impl,
        'ii-&gt;i': npyfuncs.np_int_srem_impl,
        'II-&gt;I': npyfuncs.np_int_urem_impl,
        'll-&gt;l': npyfuncs.np_int_srem_impl,
        'LL-&gt;L': npyfuncs.np_int_urem_impl,
        'qq-&gt;q': npyfuncs.np_int_srem_impl,
        'QQ-&gt;Q': npyfuncs.np_int_urem_impl,
        'ff-&gt;f': npyfuncs.np_real_mod_impl,
        'dd-&gt;d': npyfuncs.np_real_mod_impl,
    }

    ufunc_db[np.divmod] = {
        'bb-&gt;bb': npyfuncs.np_int_sdivrem_impl,
        'BB-&gt;BB': npyfuncs.np_int_udivrem_impl,
        'hh-&gt;hh': npyfuncs.np_int_sdivrem_impl,
        'HH-&gt;HH': npyfuncs.np_int_udivrem_impl,
        'ii-&gt;ii': npyfuncs.np_int_sdivrem_impl,
        'II-&gt;II': npyfuncs.np_int_udivrem_impl,
        'll-&gt;ll': npyfuncs.np_int_sdivrem_impl,
        'LL-&gt;LL': npyfuncs.np_int_udivrem_impl,
        'qq-&gt;qq': npyfuncs.np_int_sdivrem_impl,
        'QQ-&gt;QQ': npyfuncs.np_int_udivrem_impl,
        'ff-&gt;ff': npyfuncs.np_real_divmod_impl,
        'dd-&gt;dd': npyfuncs.np_real_divmod_impl,
    }

    ufunc_db[np.fmod] = {
        'bb-&gt;b': npyfuncs.np_int_fmod_impl,
        'BB-&gt;B': npyfuncs.np_int_fmod_impl,
        'hh-&gt;h': npyfuncs.np_int_fmod_impl,
        'HH-&gt;H': npyfuncs.np_int_fmod_impl,
        'ii-&gt;i': npyfuncs.np_int_fmod_impl,
        'II-&gt;I': npyfuncs.np_int_fmod_impl,
        'll-&gt;l': npyfuncs.np_int_fmod_impl,
        'LL-&gt;L': npyfuncs.np_int_fmod_impl,
        'qq-&gt;q': npyfuncs.np_int_fmod_impl,
        'QQ-&gt;Q': npyfuncs.np_int_fmod_impl,
        'ff-&gt;f': npyfuncs.np_real_fmod_impl,
        'dd-&gt;d': npyfuncs.np_real_fmod_impl,
    }

    ufunc_db[np.logaddexp] = {
        'ff-&gt;f': npyfuncs.np_real_logaddexp_impl,
        'dd-&gt;d': npyfuncs.np_real_logaddexp_impl,
    }

    ufunc_db[np.logaddexp2] = {
        'ff-&gt;f': npyfuncs.np_real_logaddexp2_impl,
        'dd-&gt;d': npyfuncs.np_real_logaddexp2_impl,
    }

    ufunc_db[np.power] = {
        'bb-&gt;b': numbers.int_power_impl,
        'BB-&gt;B': numbers.int_power_impl,
        'hh-&gt;h': numbers.int_power_impl,
        'HH-&gt;H': numbers.int_power_impl,
        'ii-&gt;i': numbers.int_power_impl,
        'II-&gt;I': numbers.int_power_impl,
        'll-&gt;l': numbers.int_power_impl,
        'LL-&gt;L': numbers.int_power_impl,
        'qq-&gt;q': numbers.int_power_impl,
        'QQ-&gt;Q': numbers.int_power_impl,
        # XXX we would like to use `int_power_impl` for real ** integer
        # as well (for better performance), but the current ufunc typing
        # rules forbid that
        'ff-&gt;f': numbers.real_power_impl,
        'dd-&gt;d': numbers.real_power_impl,
        'FF-&gt;F': npyfuncs.np_complex_power_impl,
        'DD-&gt;D': npyfuncs.np_complex_power_impl,
    }

    ufunc_db[np.float_power] = {
        'ff-&gt;f': npyfuncs.real_float_power_impl,
        'dd-&gt;d': npyfuncs.real_float_power_impl,
        'FF-&gt;F': npyfuncs.np_complex_float_power_impl,
        'DD-&gt;D': npyfuncs.np_complex_float_power_impl,
    }

    ufunc_db[np.gcd] = {
        'bb-&gt;b': npyfuncs.np_gcd_impl,
        'BB-&gt;B': npyfuncs.np_gcd_impl,
        'hh-&gt;h': npyfuncs.np_gcd_impl,
        'HH-&gt;H': npyfuncs.np_gcd_impl,
        'ii-&gt;i': npyfuncs.np_gcd_impl,
        'II-&gt;I': npyfuncs.np_gcd_impl,
        'll-&gt;l': npyfuncs.np_gcd_impl,
        'LL-&gt;L': npyfuncs.np_gcd_impl,
        'qq-&gt;q': npyfuncs.np_gcd_impl,
        'QQ-&gt;Q': npyfuncs.np_gcd_impl,
    }

    ufunc_db[np.lcm] = {
        'bb-&gt;b': npyfuncs.np_lcm_impl,
        'BB-&gt;B': npyfuncs.np_lcm_impl,
        'hh-&gt;h': npyfuncs.np_lcm_impl,
        'HH-&gt;H': npyfuncs.np_lcm_impl,
        'ii-&gt;i': npyfuncs.np_lcm_impl,
        'II-&gt;I': npyfuncs.np_lcm_impl,
        'll-&gt;l': npyfuncs.np_lcm_impl,
        'LL-&gt;L': npyfuncs.np_lcm_impl,
        'qq-&gt;q': npyfuncs.np_lcm_impl,
        'QQ-&gt;Q': npyfuncs.np_lcm_impl,
    }

    ufunc_db[np.rint] = {
        'f-&gt;f': npyfuncs.np_real_rint_impl,
        'd-&gt;d': npyfuncs.np_real_rint_impl,
        'F-&gt;F': npyfuncs.np_complex_rint_impl,
        'D-&gt;D': npyfuncs.np_complex_rint_impl,
    }

    ufunc_db[np.conjugate] = {
        'b-&gt;b': numbers.real_conjugate_impl,
        'B-&gt;B': numbers.real_conjugate_impl,
        'h-&gt;h': numbers.real_conjugate_impl,
        'H-&gt;H': numbers.real_conjugate_impl,
        'i-&gt;i': numbers.real_conjugate_impl,
        'I-&gt;I': numbers.real_conjugate_impl,
        'l-&gt;l': numbers.real_conjugate_impl,
        'L-&gt;L': numbers.real_conjugate_impl,
        'q-&gt;q': numbers.real_conjugate_impl,
        'Q-&gt;Q': numbers.real_conjugate_impl,
        'f-&gt;f': numbers.real_conjugate_impl,
        'd-&gt;d': numbers.real_conjugate_impl,
        'F-&gt;F': numbers.complex_conjugate_impl,
        'D-&gt;D': numbers.complex_conjugate_impl,
    }

    ufunc_db[np.exp] = {
        'f-&gt;f': npyfuncs.np_real_exp_impl,
        'd-&gt;d': npyfuncs.np_real_exp_impl,
        'F-&gt;F': npyfuncs.np_complex_exp_impl,
        'D-&gt;D': npyfuncs.np_complex_exp_impl,
    }

    ufunc_db[np.exp2] = {
        'f-&gt;f': npyfuncs.np_real_exp2_impl,
        'd-&gt;d': npyfuncs.np_real_exp2_impl,
        'F-&gt;F': npyfuncs.np_complex_exp2_impl,
        'D-&gt;D': npyfuncs.np_complex_exp2_impl,
    }

    ufunc_db[np.log] = {
        'f-&gt;f': npyfuncs.np_real_log_impl,
        'd-&gt;d': npyfuncs.np_real_log_impl,
        'F-&gt;F': npyfuncs.np_complex_log_impl,
        'D-&gt;D': npyfuncs.np_complex_log_impl,
    }

    ufunc_db[np.log2] = {
        'f-&gt;f': npyfuncs.np_real_log2_impl,
        'd-&gt;d': npyfuncs.np_real_log2_impl,
        'F-&gt;F': npyfuncs.np_complex_log2_impl,
        'D-&gt;D': npyfuncs.np_complex_log2_impl,
    }

    ufunc_db[np.log10] = {
        'f-&gt;f': npyfuncs.np_real_log10_impl,
        'd-&gt;d': npyfuncs.np_real_log10_impl,
        'F-&gt;F': npyfuncs.np_complex_log10_impl,
        'D-&gt;D': npyfuncs.np_complex_log10_impl,
    }

    ufunc_db[np.expm1] = {
        'f-&gt;f': npyfuncs.np_real_expm1_impl,
        'd-&gt;d': npyfuncs.np_real_expm1_impl,
        'F-&gt;F': npyfuncs.np_complex_expm1_impl,
        'D-&gt;D': npyfuncs.np_complex_expm1_impl,
    }

    ufunc_db[np.log1p] = {
        'f-&gt;f': npyfuncs.np_real_log1p_impl,
        'd-&gt;d': npyfuncs.np_real_log1p_impl,
        'F-&gt;F': npyfuncs.np_complex_log1p_impl,
        'D-&gt;D': npyfuncs.np_complex_log1p_impl,
    }

    ufunc_db[np.sqrt] = {
        'f-&gt;f': npyfuncs.np_real_sqrt_impl,
        'd-&gt;d': npyfuncs.np_real_sqrt_impl,
        'F-&gt;F': npyfuncs.np_complex_sqrt_impl,
        'D-&gt;D': npyfuncs.np_complex_sqrt_impl,
    }

    ufunc_db[np.square] = {
        'b-&gt;b': npyfuncs.np_int_square_impl,
        'B-&gt;B': npyfuncs.np_int_square_impl,
        'h-&gt;h': npyfuncs.np_int_square_impl,
        'H-&gt;H': npyfuncs.np_int_square_impl,
        'i-&gt;i': npyfuncs.np_int_square_impl,
        'I-&gt;I': npyfuncs.np_int_square_impl,
        'l-&gt;l': npyfuncs.np_int_square_impl,
        'L-&gt;L': npyfuncs.np_int_square_impl,
        'q-&gt;q': npyfuncs.np_int_square_impl,
        'Q-&gt;Q': npyfuncs.np_int_square_impl,
        'f-&gt;f': npyfuncs.np_real_square_impl,
        'd-&gt;d': npyfuncs.np_real_square_impl,
        'F-&gt;F': npyfuncs.np_complex_square_impl,
        'D-&gt;D': npyfuncs.np_complex_square_impl,
    }

    ufunc_db[np.cbrt] = {
        'f-&gt;f': npyfuncs.np_real_cbrt_impl,
        'd-&gt;d': npyfuncs.np_real_cbrt_impl,
    }

    ufunc_db[np.reciprocal] = {
        'b-&gt;b': npyfuncs.np_int_reciprocal_impl,
        'B-&gt;B': npyfuncs.np_int_reciprocal_impl,
        'h-&gt;h': npyfuncs.np_int_reciprocal_impl,
        'H-&gt;H': npyfuncs.np_int_reciprocal_impl,
        'i-&gt;i': npyfuncs.np_int_reciprocal_impl,
        'I-&gt;I': npyfuncs.np_int_reciprocal_impl,
        'l-&gt;l': npyfuncs.np_int_reciprocal_impl,
        'L-&gt;L': npyfuncs.np_int_reciprocal_impl,
        'q-&gt;q': npyfuncs.np_int_reciprocal_impl,
        'Q-&gt;Q': npyfuncs.np_int_reciprocal_impl,
        'f-&gt;f': npyfuncs.np_real_reciprocal_impl,
        'd-&gt;d': npyfuncs.np_real_reciprocal_impl,
        'F-&gt;F': npyfuncs.np_complex_reciprocal_impl,
        'D-&gt;D': npyfuncs.np_complex_reciprocal_impl,
    }

    ufunc_db[np.sin] = {
        'f-&gt;f': npyfuncs.np_real_sin_impl,
        'd-&gt;d': npyfuncs.np_real_sin_impl,
        'F-&gt;F': npyfuncs.np_complex_sin_impl,
        'D-&gt;D': npyfuncs.np_complex_sin_impl,
    }

    ufunc_db[np.cos] = {
        'f-&gt;f': npyfuncs.np_real_cos_impl,
        'd-&gt;d': npyfuncs.np_real_cos_impl,
        'F-&gt;F': npyfuncs.np_complex_cos_impl,
        'D-&gt;D': npyfuncs.np_complex_cos_impl,
    }

    tan_impl = cmathimpl.tan_impl

    ufunc_db[np.tan] = {
        'f-&gt;f': npyfuncs.np_real_tan_impl,
        'd-&gt;d': npyfuncs.np_real_tan_impl,
        'F-&gt;F': tan_impl,
        'D-&gt;D': tan_impl,
    }

    arcsin_impl = cmathimpl.asin_impl

    ufunc_db[np.arcsin] = {
        'f-&gt;f': npyfuncs.np_real_asin_impl,
        'd-&gt;d': npyfuncs.np_real_asin_impl,
        'F-&gt;F': arcsin_impl,
        'D-&gt;D': arcsin_impl,
    }

    ufunc_db[np.arccos] = {
        'f-&gt;f': npyfuncs.np_real_acos_impl,
        'd-&gt;d': npyfuncs.np_real_acos_impl,
        'F-&gt;F': cmathimpl.acos_impl,
        'D-&gt;D': cmathimpl.acos_impl,
    }

    arctan_impl = cmathimpl.atan_impl

    ufunc_db[np.arctan] = {
        'f-&gt;f': npyfuncs.np_real_atan_impl,
        'd-&gt;d': npyfuncs.np_real_atan_impl,
        'F-&gt;F': arctan_impl,
        'D-&gt;D': arctan_impl,
    }

    ufunc_db[np.arctan2] = {
        'ff-&gt;f': npyfuncs.np_real_atan2_impl,
        'dd-&gt;d': npyfuncs.np_real_atan2_impl,
    }

    ufunc_db[np.hypot] = {
        'ff-&gt;f': npyfuncs.np_real_hypot_impl,
        'dd-&gt;d': npyfuncs.np_real_hypot_impl,
    }

    ufunc_db[np.sinh] = {
        'f-&gt;f': npyfuncs.np_real_sinh_impl,
        'd-&gt;d': npyfuncs.np_real_sinh_impl,
        'F-&gt;F': npyfuncs.np_complex_sinh_impl,
        'D-&gt;D': npyfuncs.np_complex_sinh_impl,
    }

    ufunc_db[np.cosh] = {
        'f-&gt;f': npyfuncs.np_real_cosh_impl,
        'd-&gt;d': npyfuncs.np_real_cosh_impl,
        'F-&gt;F': npyfuncs.np_complex_cosh_impl,
        'D-&gt;D': npyfuncs.np_complex_cosh_impl,
    }

    ufunc_db[np.tanh] = {
        'f-&gt;f': npyfuncs.np_real_tanh_impl,
        'd-&gt;d': npyfuncs.np_real_tanh_impl,
        'F-&gt;F': npyfuncs.np_complex_tanh_impl,
        'D-&gt;D': npyfuncs.np_complex_tanh_impl,
    }

    arcsinh_impl = cmathimpl.asinh_impl

    ufunc_db[np.arcsinh] = {
        'f-&gt;f': npyfuncs.np_real_asinh_impl,
        'd-&gt;d': npyfuncs.np_real_asinh_impl,
        'F-&gt;F': arcsinh_impl,
        'D-&gt;D': arcsinh_impl,
    }

    ufunc_db[np.arccosh] = {
        'f-&gt;f': npyfuncs.np_real_acosh_impl,
        'd-&gt;d': npyfuncs.np_real_acosh_impl,
        'F-&gt;F': npyfuncs.np_complex_acosh_impl,
        'D-&gt;D': npyfuncs.np_complex_acosh_impl,
    }

    arctanh_impl = cmathimpl.atanh_impl

    ufunc_db[np.arctanh] = {
        'f-&gt;f': npyfuncs.np_real_atanh_impl,
        'd-&gt;d': npyfuncs.np_real_atanh_impl,
        'F-&gt;F': arctanh_impl,
        'D-&gt;D': arctanh_impl,
    }

    ufunc_db[np.deg2rad] = {
        'f-&gt;f': mathimpl.radians_float_impl,
        'd-&gt;d': mathimpl.radians_float_impl,
    }

    ufunc_db[np.radians] = ufunc_db[np.deg2rad]

    ufunc_db[np.rad2deg] = {
        'f-&gt;f': mathimpl.degrees_float_impl,
        'd-&gt;d': mathimpl.degrees_float_impl,
    }

    ufunc_db[np.degrees] = ufunc_db[np.rad2deg]

    ufunc_db[np.floor] = {
        'f-&gt;f': npyfuncs.np_real_floor_impl,
        'd-&gt;d': npyfuncs.np_real_floor_impl,
    }
    if numpy_version &gt;= (2, 1):
        ufunc_db[np.floor].update({
            '?-&gt;?': numbers.identity_impl,
            'b-&gt;b': numbers.identity_impl,
            'B-&gt;B': numbers.identity_impl,
            'h-&gt;h': numbers.identity_impl,
            'H-&gt;H': numbers.identity_impl,
            'i-&gt;i': numbers.identity_impl,
            'I-&gt;I': numbers.identity_impl,
            'l-&gt;l': numbers.identity_impl,
            'L-&gt;L': numbers.identity_impl,
            'q-&gt;q': numbers.identity_impl,
            'Q-&gt;Q': numbers.identity_impl,
        })

    ufunc_db[np.ceil] = {
        'f-&gt;f': npyfuncs.np_real_ceil_impl,
        'd-&gt;d': npyfuncs.np_real_ceil_impl,
    }
    if numpy_version &gt;= (2, 1):
        ufunc_db[np.ceil].update({
            '?-&gt;?': numbers.identity_impl,
            'b-&gt;b': numbers.identity_impl,
            'B-&gt;B': numbers.identity_impl,
            'h-&gt;h': numbers.identity_impl,
            'H-&gt;H': numbers.identity_impl,
            'i-&gt;i': numbers.identity_impl,
            'I-&gt;I': numbers.identity_impl,
            'l-&gt;l': numbers.identity_impl,
            'L-&gt;L': numbers.identity_impl,
            'q-&gt;q': numbers.identity_impl,
            'Q-&gt;Q': numbers.identity_impl,
        })

    ufunc_db[np.trunc] = {
        'f-&gt;f': npyfuncs.np_real_trunc_impl,
        'd-&gt;d': npyfuncs.np_real_trunc_impl,
    }
    if numpy_version &gt;= (2, 1):
        ufunc_db[np.trunc].update({
            '?-&gt;?': numbers.identity_impl,
            'b-&gt;b': numbers.identity_impl,
            'B-&gt;B': numbers.identity_impl,
            'h-&gt;h': numbers.identity_impl,
            'H-&gt;H': numbers.identity_impl,
            'i-&gt;i': numbers.identity_impl,
            'I-&gt;I': numbers.identity_impl,
            'l-&gt;l': numbers.identity_impl,
            'L-&gt;L': numbers.identity_impl,
            'q-&gt;q': numbers.identity_impl,
            'Q-&gt;Q': numbers.identity_impl,
        })

    ufunc_db[np.fabs] = {
        'f-&gt;f': npyfuncs.np_real_fabs_impl,
        'd-&gt;d': npyfuncs.np_real_fabs_impl,
    }

    # logical ufuncs
    ufunc_db[np.greater] = {
        '??-&gt;?': numbers.int_ugt_impl,
        'bb-&gt;?': numbers.int_sgt_impl,
        'BB-&gt;?': numbers.int_ugt_impl,
        'hh-&gt;?': numbers.int_sgt_impl,
        'HH-&gt;?': numbers.int_ugt_impl,
        'ii-&gt;?': numbers.int_sgt_impl,
        'II-&gt;?': numbers.int_ugt_impl,
        'll-&gt;?': numbers.int_sgt_impl,
        'LL-&gt;?': numbers.int_ugt_impl,
        'qq-&gt;?': numbers.int_sgt_impl,
        'QQ-&gt;?': numbers.int_ugt_impl,
        'ff-&gt;?': numbers.real_gt_impl,
        'dd-&gt;?': numbers.real_gt_impl,
        'FF-&gt;?': npyfuncs.np_complex_gt_impl,
        'DD-&gt;?': npyfuncs.np_complex_gt_impl,
    }
    if numpy_version &gt;= (1, 25):
        ufunc_db[np.greater].update({
            'qQ-&gt;?': numbers.int_signed_unsigned_cmp('&gt;'),
            'Qq-&gt;?': numbers.int_unsigned_signed_cmp('&gt;')})

    ufunc_db[np.greater_equal] = {
        '??-&gt;?': numbers.int_uge_impl,
        'bb-&gt;?': numbers.int_sge_impl,
        'BB-&gt;?': numbers.int_uge_impl,
        'hh-&gt;?': numbers.int_sge_impl,
        'HH-&gt;?': numbers.int_uge_impl,
        'ii-&gt;?': numbers.int_sge_impl,
        'II-&gt;?': numbers.int_uge_impl,
        'll-&gt;?': numbers.int_sge_impl,
        'LL-&gt;?': numbers.int_uge_impl,
        'qq-&gt;?': numbers.int_sge_impl,
        'QQ-&gt;?': numbers.int_uge_impl,
        'ff-&gt;?': numbers.real_ge_impl,
        'dd-&gt;?': numbers.real_ge_impl,
        'FF-&gt;?': npyfuncs.np_complex_ge_impl,
        'DD-&gt;?': npyfuncs.np_complex_ge_impl,
    }
    if numpy_version &gt;= (1, 25):
        ufunc_db[np.greater_equal].update({
            'qQ-&gt;?': numbers.int_signed_unsigned_cmp('&gt;='),
            'Qq-&gt;?': numbers.int_unsigned_signed_cmp('&gt;=')})

    ufunc_db[np.less] = {
        '??-&gt;?': numbers.int_ult_impl,
        'bb-&gt;?': numbers.int_slt_impl,
        'BB-&gt;?': numbers.int_ult_impl,
        'hh-&gt;?': numbers.int_slt_impl,
        'HH-&gt;?': numbers.int_ult_impl,
        'ii-&gt;?': numbers.int_slt_impl,
        'II-&gt;?': numbers.int_ult_impl,
        'll-&gt;?': numbers.int_slt_impl,
        'LL-&gt;?': numbers.int_ult_impl,
        'qq-&gt;?': numbers.int_slt_impl,
        'QQ-&gt;?': numbers.int_ult_impl,
        'ff-&gt;?': numbers.real_lt_impl,
        'dd-&gt;?': numbers.real_lt_impl,
        'FF-&gt;?': npyfuncs.np_complex_lt_impl,
        'DD-&gt;?': npyfuncs.np_complex_lt_impl,
    }
    if numpy_version &gt;= (1, 25):
        ufunc_db[np.less].update({
            'qQ-&gt;?': numbers.int_signed_unsigned_cmp('&lt;'),
            'Qq-&gt;?': numbers.int_unsigned_signed_cmp('&lt;')})

    ufunc_db[np.less_equal] = {
        '??-&gt;?': numbers.int_ule_impl,
        'bb-&gt;?': numbers.int_sle_impl,
        'BB-&gt;?': numbers.int_ule_impl,
        'hh-&gt;?': numbers.int_sle_impl,
        'HH-&gt;?': numbers.int_ule_impl,
        'ii-&gt;?': numbers.int_sle_impl,
        'II-&gt;?': numbers.int_ule_impl,
        'll-&gt;?': numbers.int_sle_impl,
        'LL-&gt;?': numbers.int_ule_impl,
        'qq-&gt;?': numbers.int_sle_impl,
        'QQ-&gt;?': numbers.int_ule_impl,
        'ff-&gt;?': numbers.real_le_impl,
        'dd-&gt;?': numbers.real_le_impl,
        'FF-&gt;?': npyfuncs.np_complex_le_impl,
        'DD-&gt;?': npyfuncs.np_complex_le_impl,
    }
    if numpy_version &gt;= (1, 25):
        ufunc_db[np.less_equal].update({
            'qQ-&gt;?': numbers.int_signed_unsigned_cmp('&lt;='),
            'Qq-&gt;?': numbers.int_unsigned_signed_cmp('&lt;=')})

    ufunc_db[np.not_equal] = {
        '??-&gt;?': numbers.int_ne_impl,
        'bb-&gt;?': numbers.int_ne_impl,
        'BB-&gt;?': numbers.int_ne_impl,
        'hh-&gt;?': numbers.int_ne_impl,
        'HH-&gt;?': numbers.int_ne_impl,
        'ii-&gt;?': numbers.int_ne_impl,
        'II-&gt;?': numbers.int_ne_impl,
        'll-&gt;?': numbers.int_ne_impl,
        'LL-&gt;?': numbers.int_ne_impl,
        'qq-&gt;?': numbers.int_ne_impl,
        'QQ-&gt;?': numbers.int_ne_impl,
        'ff-&gt;?': numbers.real_ne_impl,
        'dd-&gt;?': numbers.real_ne_impl,
        'FF-&gt;?': npyfuncs.np_complex_ne_impl,
        'DD-&gt;?': npyfuncs.np_complex_ne_impl,
    }
    if numpy_version &gt;= (1, 25):
        ufunc_db[np.not_equal].update({
            'qQ-&gt;?': numbers.int_signed_unsigned_cmp('!='),
            'Qq-&gt;?': numbers.int_unsigned_signed_cmp('!=')})

    ufunc_db[np.equal] = {
        '??-&gt;?': numbers.int_eq_impl,
        'bb-&gt;?': numbers.int_eq_impl,
        'BB-&gt;?': numbers.int_eq_impl,
        'hh-&gt;?': numbers.int_eq_impl,
        'HH-&gt;?': numbers.int_eq_impl,
        'ii-&gt;?': numbers.int_eq_impl,
        'II-&gt;?': numbers.int_eq_impl,
        'll-&gt;?': numbers.int_eq_impl,
        'LL-&gt;?': numbers.int_eq_impl,
        'qq-&gt;?': numbers.int_eq_impl,
        'QQ-&gt;?': numbers.int_eq_impl,
        'ff-&gt;?': numbers.real_eq_impl,
        'dd-&gt;?': numbers.real_eq_impl,
        'FF-&gt;?': npyfuncs.np_complex_eq_impl,
        'DD-&gt;?': npyfuncs.np_complex_eq_impl,
    }
    if numpy_version &gt;= (1, 25):
        ufunc_db[np.equal].update({
            'qQ-&gt;?': numbers.int_signed_unsigned_cmp('=='),
            'Qq-&gt;?': numbers.int_unsigned_signed_cmp('==')})

    ufunc_db[np.logical_and] = {
        '??-&gt;?': npyfuncs.np_logical_and_impl,
        'bb-&gt;?': npyfuncs.np_logical_and_impl,
        'BB-&gt;?': npyfuncs.np_logical_and_impl,
        'hh-&gt;?': npyfuncs.np_logical_and_impl,
        'HH-&gt;?': npyfuncs.np_logical_and_impl,
        'ii-&gt;?': npyfuncs.np_logical_and_impl,
        'II-&gt;?': npyfuncs.np_logical_and_impl,
        'll-&gt;?': npyfuncs.np_logical_and_impl,
        'LL-&gt;?': npyfuncs.np_logical_and_impl,
        'qq-&gt;?': npyfuncs.np_logical_and_impl,
        'QQ-&gt;?': npyfuncs.np_logical_and_impl,
        'ff-&gt;?': npyfuncs.np_logical_and_impl,
        'dd-&gt;?': npyfuncs.np_logical_and_impl,
        'FF-&gt;?': npyfuncs.np_complex_logical_and_impl,
        'DD-&gt;?': npyfuncs.np_complex_logical_and_impl,
    }

    ufunc_db[np.logical_or] = {
        '??-&gt;?': npyfuncs.np_logical_or_impl,
        'bb-&gt;?': npyfuncs.np_logical_or_impl,
        'BB-&gt;?': npyfuncs.np_logical_or_impl,
        'hh-&gt;?': npyfuncs.np_logical_or_impl,
        'HH-&gt;?': npyfuncs.np_logical_or_impl,
        'ii-&gt;?': npyfuncs.np_logical_or_impl,
        'II-&gt;?': npyfuncs.np_logical_or_impl,
        'll-&gt;?': npyfuncs.np_logical_or_impl,
        'LL-&gt;?': npyfuncs.np_logical_or_impl,
        'qq-&gt;?': npyfuncs.np_logical_or_impl,
        'QQ-&gt;?': npyfuncs.np_logical_or_impl,
        'ff-&gt;?': npyfuncs.np_logical_or_impl,
        'dd-&gt;?': npyfuncs.np_logical_or_impl,
        'FF-&gt;?': npyfuncs.np_complex_logical_or_impl,
        'DD-&gt;?': npyfuncs.np_complex_logical_or_impl,
    }

    ufunc_db[np.logical_xor] = {
        '??-&gt;?': npyfuncs.np_logical_xor_impl,
        'bb-&gt;?': npyfuncs.np_logical_xor_impl,
        'BB-&gt;?': npyfuncs.np_logical_xor_impl,
        'hh-&gt;?': npyfuncs.np_logical_xor_impl,
        'HH-&gt;?': npyfuncs.np_logical_xor_impl,
        'ii-&gt;?': npyfuncs.np_logical_xor_impl,
        'II-&gt;?': npyfuncs.np_logical_xor_impl,
        'll-&gt;?': npyfuncs.np_logical_xor_impl,
        'LL-&gt;?': npyfuncs.np_logical_xor_impl,
        'qq-&gt;?': npyfuncs.np_logical_xor_impl,
        'QQ-&gt;?': npyfuncs.np_logical_xor_impl,
        'ff-&gt;?': npyfuncs.np_logical_xor_impl,
        'dd-&gt;?': npyfuncs.np_logical_xor_impl,
        'FF-&gt;?': npyfuncs.np_complex_logical_xor_impl,
        'DD-&gt;?': npyfuncs.np_complex_logical_xor_impl,
    }

    ufunc_db[np.logical_not] = {
        '?-&gt;?': npyfuncs.np_logical_not_impl,
        'b-&gt;?': npyfuncs.np_logical_not_impl,
        'B-&gt;?': npyfuncs.np_logical_not_impl,
        'h-&gt;?': npyfuncs.np_logical_not_impl,
        'H-&gt;?': npyfuncs.np_logical_not_impl,
        'i-&gt;?': npyfuncs.np_logical_not_impl,
        'I-&gt;?': npyfuncs.np_logical_not_impl,
        'l-&gt;?': npyfuncs.np_logical_not_impl,
        'L-&gt;?': npyfuncs.np_logical_not_impl,
        'q-&gt;?': npyfuncs.np_logical_not_impl,
        'Q-&gt;?': npyfuncs.np_logical_not_impl,
        'f-&gt;?': npyfuncs.np_logical_not_impl,
        'd-&gt;?': npyfuncs.np_logical_not_impl,
        'F-&gt;?': npyfuncs.np_complex_logical_not_impl,
        'D-&gt;?': npyfuncs.np_complex_logical_not_impl,
    }

    ufunc_db[np.maximum] = {
        '??-&gt;?': npyfuncs.np_logical_or_impl,
        'bb-&gt;b': npyfuncs.np_int_smax_impl,
        'BB-&gt;B': npyfuncs.np_int_umax_impl,
        'hh-&gt;h': npyfuncs.np_int_smax_impl,
        'HH-&gt;H': npyfuncs.np_int_umax_impl,
        'ii-&gt;i': npyfuncs.np_int_smax_impl,
        'II-&gt;I': npyfuncs.np_int_umax_impl,
        'll-&gt;l': npyfuncs.np_int_smax_impl,
        'LL-&gt;L': npyfuncs.np_int_umax_impl,
        'qq-&gt;q': npyfuncs.np_int_smax_impl,
        'QQ-&gt;Q': npyfuncs.np_int_umax_impl,
        'ff-&gt;f': npyfuncs.np_real_maximum_impl,
        'dd-&gt;d': npyfuncs.np_real_maximum_impl,
        'FF-&gt;F': npyfuncs.np_complex_maximum_impl,
        'DD-&gt;D': npyfuncs.np_complex_maximum_impl,
    }

    ufunc_db[np.minimum] = {
        '??-&gt;?': npyfuncs.np_logical_and_impl,
        'bb-&gt;b': npyfuncs.np_int_smin_impl,
        'BB-&gt;B': npyfuncs.np_int_umin_impl,
        'hh-&gt;h': npyfuncs.np_int_smin_impl,
        'HH-&gt;H': npyfuncs.np_int_umin_impl,
        'ii-&gt;i': npyfuncs.np_int_smin_impl,
        'II-&gt;I': npyfuncs.np_int_umin_impl,
        'll-&gt;l': npyfuncs.np_int_smin_impl,
        'LL-&gt;L': npyfuncs.np_int_umin_impl,
        'qq-&gt;q': npyfuncs.np_int_smin_impl,
        'QQ-&gt;Q': npyfuncs.np_int_umin_impl,
        'ff-&gt;f': npyfuncs.np_real_minimum_impl,
        'dd-&gt;d': npyfuncs.np_real_minimum_impl,
        'FF-&gt;F': npyfuncs.np_complex_minimum_impl,
        'DD-&gt;D': npyfuncs.np_complex_minimum_impl,
    }

    ufunc_db[np.fmax] = {
        '??-&gt;?': npyfuncs.np_logical_or_impl,
        'bb-&gt;b': npyfuncs.np_int_smax_impl,
        'BB-&gt;B': npyfuncs.np_int_umax_impl,
        'hh-&gt;h': npyfuncs.np_int_smax_impl,
        'HH-&gt;H': npyfuncs.np_int_umax_impl,
        'ii-&gt;i': npyfuncs.np_int_smax_impl,
        'II-&gt;I': npyfuncs.np_int_umax_impl,
        'll-&gt;l': npyfuncs.np_int_smax_impl,
        'LL-&gt;L': npyfuncs.np_int_umax_impl,
        'qq-&gt;q': npyfuncs.np_int_smax_impl,
        'QQ-&gt;Q': npyfuncs.np_int_umax_impl,
        'ff-&gt;f': npyfuncs.np_real_fmax_impl,
        'dd-&gt;d': npyfuncs.np_real_fmax_impl,
        'FF-&gt;F': npyfuncs.np_complex_fmax_impl,
        'DD-&gt;D': npyfuncs.np_complex_fmax_impl,
    }

    ufunc_db[np.fmin] = {
        '??-&gt;?': npyfuncs.np_logical_and_impl,
        'bb-&gt;b': npyfuncs.np_int_smin_impl,
        'BB-&gt;B': npyfuncs.np_int_umin_impl,
        'hh-&gt;h': npyfuncs.np_int_smin_impl,
        'HH-&gt;H': npyfuncs.np_int_umin_impl,
        'ii-&gt;i': npyfuncs.np_int_smin_impl,
        'II-&gt;I': npyfuncs.np_int_umin_impl,
        'll-&gt;l': npyfuncs.np_int_smin_impl,
        'LL-&gt;L': npyfuncs.np_int_umin_impl,
        'qq-&gt;q': npyfuncs.np_int_smin_impl,
        'QQ-&gt;Q': npyfuncs.np_int_umin_impl,
        'ff-&gt;f': npyfuncs.np_real_fmin_impl,
        'dd-&gt;d': npyfuncs.np_real_fmin_impl,
        'FF-&gt;F': npyfuncs.np_complex_fmin_impl,
        'DD-&gt;D': npyfuncs.np_complex_fmin_impl,
    }

    # misc floating functions
    ufunc_db[np.isnan] = {
        'f-&gt;?': npyfuncs.np_real_isnan_impl,
        'd-&gt;?': npyfuncs.np_real_isnan_impl,
        'F-&gt;?': npyfuncs.np_complex_isnan_impl,
        'D-&gt;?': npyfuncs.np_complex_isnan_impl,
        # int8
        'b-&gt;?': npyfuncs.np_int_isnan_impl,
        'B-&gt;?': npyfuncs.np_int_isnan_impl,
        # int16
        'h-&gt;?': npyfuncs.np_int_isnan_impl,
        'H-&gt;?': npyfuncs.np_int_isnan_impl,
        # int32
        'i-&gt;?': npyfuncs.np_int_isnan_impl,
        'I-&gt;?': npyfuncs.np_int_isnan_impl,
        # int64
        'l-&gt;?': npyfuncs.np_int_isnan_impl,
        'L-&gt;?': npyfuncs.np_int_isnan_impl,
        # intp
        'q-&gt;?': npyfuncs.np_int_isnan_impl,
        'Q-&gt;?': npyfuncs.np_int_isnan_impl,
        # boolean
        '?-&gt;?': npyfuncs.np_int_isnan_impl,
        # datetime &amp; timedelta
        'm-&gt;?': npyfuncs.np_datetime_isnat_impl,
        'M-&gt;?': npyfuncs.np_datetime_isnat_impl,
    }

    ufunc_db[np.isinf] = {
        'f-&gt;?': npyfuncs.np_real_isinf_impl,
        'd-&gt;?': npyfuncs.np_real_isinf_impl,
        'F-&gt;?': npyfuncs.np_complex_isinf_impl,
        'D-&gt;?': npyfuncs.np_complex_isinf_impl,
        # int8
        'b-&gt;?': npyfuncs.np_int_isinf_impl,
        'B-&gt;?': npyfuncs.np_int_isinf_impl,
        # int16
        'h-&gt;?': npyfuncs.np_int_isinf_impl,
        'H-&gt;?': npyfuncs.np_int_isinf_impl,
        # int32
        'i-&gt;?': npyfuncs.np_int_isinf_impl,
        'I-&gt;?': npyfuncs.np_int_isinf_impl,
        # int64
        'l-&gt;?': npyfuncs.np_int_isinf_impl,
        'L-&gt;?': npyfuncs.np_int_isinf_impl,
        # intp
        'q-&gt;?': npyfuncs.np_int_isinf_impl,
        'Q-&gt;?': npyfuncs.np_int_isinf_impl,
        # boolean
        '?-&gt;?': npyfuncs.np_int_isinf_impl,
        # datetime &amp; timedelta
        'm-&gt;?': npyfuncs.np_int_isinf_impl,
        'M-&gt;?': npyfuncs.np_int_isinf_impl,
    }

    ufunc_db[np.isfinite] = {
        'f-&gt;?': npyfuncs.np_real_isfinite_impl,
        'd-&gt;?': npyfuncs.np_real_isfinite_impl,
        'F-&gt;?': npyfuncs.np_complex_isfinite_impl,
        'D-&gt;?': npyfuncs.np_complex_isfinite_impl,
        # int8
        'b-&gt;?': npyfuncs.np_int_isfinite_impl,
        'B-&gt;?': npyfuncs.np_int_isfinite_impl,
        # int16
        'h-&gt;?': npyfuncs.np_int_isfinite_impl,
        'H-&gt;?': npyfuncs.np_int_isfinite_impl,
        # int32
        'i-&gt;?': npyfuncs.np_int_isfinite_impl,
        'I-&gt;?': npyfuncs.np_int_isfinite_impl,
        # int64
        'l-&gt;?': npyfuncs.np_int_isfinite_impl,
        'L-&gt;?': npyfuncs.np_int_isfinite_impl,
        # intp
        'q-&gt;?': npyfuncs.np_int_isfinite_impl,
        'Q-&gt;?': npyfuncs.np_int_isfinite_impl,
        # boolean
        '?-&gt;?': npyfuncs.np_int_isfinite_impl,
        # datetime &amp; timedelta
        'M-&gt;?': npyfuncs.np_datetime_isfinite_impl,
        'm-&gt;?': npyfuncs.np_datetime_isfinite_impl,
    }

    ufunc_db[np.signbit] = {
        'f-&gt;?': npyfuncs.np_real_signbit_impl,
        'd-&gt;?': npyfuncs.np_real_signbit_impl,
    }

    ufunc_db[np.copysign] = {
        'ff-&gt;f': npyfuncs.np_real_copysign_impl,
        'dd-&gt;d': npyfuncs.np_real_copysign_impl,
    }

    ufunc_db[np.nextafter] = {
        'ff-&gt;f': npyfuncs.np_real_nextafter_impl,
        'dd-&gt;d': npyfuncs.np_real_nextafter_impl,
    }

    ufunc_db[np.spacing] = {
        'f-&gt;f': npyfuncs.np_real_spacing_impl,
        'd-&gt;d': npyfuncs.np_real_spacing_impl,
    }

    ufunc_db[np.ldexp] = {
        'fi-&gt;f': npyfuncs.np_real_ldexp_impl,
        'fl-&gt;f': npyfuncs.np_real_ldexp_impl,
        'di-&gt;d': npyfuncs.np_real_ldexp_impl,
        'dl-&gt;d': npyfuncs.np_real_ldexp_impl,
    }
    if numpy_version &gt;= (2, 0) and IS_WIN32:
        ufunc_db[np.ldexp]['fq-&gt;f'] = ufunc_db[np.ldexp].pop('fl-&gt;f')
        ufunc_db[np.ldexp]['dq-&gt;d'] = ufunc_db[np.ldexp].pop('dl-&gt;d')

    # bit twiddling functions
    ufunc_db[np.bitwise_and] = {
        '??-&gt;?': numbers.int_and_impl,
        'bb-&gt;b': numbers.int_and_impl,
        'BB-&gt;B': numbers.int_and_impl,
        'hh-&gt;h': numbers.int_and_impl,
        'HH-&gt;H': numbers.int_and_impl,
        'ii-&gt;i': numbers.int_and_impl,
        'II-&gt;I': numbers.int_and_impl,
        'll-&gt;l': numbers.int_and_impl,
        'LL-&gt;L': numbers.int_and_impl,
        'qq-&gt;q': numbers.int_and_impl,
        'QQ-&gt;Q': numbers.int_and_impl,
    }

    ufunc_db[np.bitwise_or] = {
        '??-&gt;?': numbers.int_or_impl,
        'bb-&gt;b': numbers.int_or_impl,
        'BB-&gt;B': numbers.int_or_impl,
        'hh-&gt;h': numbers.int_or_impl,
        'HH-&gt;H': numbers.int_or_impl,
        'ii-&gt;i': numbers.int_or_impl,
        'II-&gt;I': numbers.int_or_impl,
        'll-&gt;l': numbers.int_or_impl,
        'LL-&gt;L': numbers.int_or_impl,
        'qq-&gt;q': numbers.int_or_impl,
        'QQ-&gt;Q': numbers.int_or_impl,
    }

    ufunc_db[np.bitwise_xor] = {
        '??-&gt;?': numbers.int_xor_impl,
        'bb-&gt;b': numbers.int_xor_impl,
        'BB-&gt;B': numbers.int_xor_impl,
        'hh-&gt;h': numbers.int_xor_impl,
        'HH-&gt;H': numbers.int_xor_impl,
        'ii-&gt;i': numbers.int_xor_impl,
        'II-&gt;I': numbers.int_xor_impl,
        'll-&gt;l': numbers.int_xor_impl,
        'LL-&gt;L': numbers.int_xor_impl,
        'qq-&gt;q': numbers.int_xor_impl,
        'QQ-&gt;Q': numbers.int_xor_impl,
    }

    ufunc_db[np.invert] = {  # aka np.bitwise_not
        '?-&gt;?': numbers.int_invert_impl,
        'b-&gt;b': numbers.int_invert_impl,
        'B-&gt;B': numbers.int_invert_impl,
        'h-&gt;h': numbers.int_invert_impl,
        'H-&gt;H': numbers.int_invert_impl,
        'i-&gt;i': numbers.int_invert_impl,
        'I-&gt;I': numbers.int_invert_impl,
        'l-&gt;l': numbers.int_invert_impl,
        'L-&gt;L': numbers.int_invert_impl,
        'q-&gt;q': numbers.int_invert_impl,
        'Q-&gt;Q': numbers.int_invert_impl,
    }

    ufunc_db[np.left_shift] = {
        'bb-&gt;b': numbers.int_shl_impl,
        'BB-&gt;B': numbers.int_shl_impl,
        'hh-&gt;h': numbers.int_shl_impl,
        'HH-&gt;H': numbers.int_shl_impl,
        'ii-&gt;i': numbers.int_shl_impl,
        'II-&gt;I': numbers.int_shl_impl,
        'll-&gt;l': numbers.int_shl_impl,
        'LL-&gt;L': numbers.int_shl_impl,
        'qq-&gt;q': numbers.int_shl_impl,
        'QQ-&gt;Q': numbers.int_shl_impl,
    }

    ufunc_db[np.right_shift] = {
        'bb-&gt;b': numbers.int_shr_impl,
        'BB-&gt;B': numbers.int_shr_impl,
        'hh-&gt;h': numbers.int_shr_impl,
        'HH-&gt;H': numbers.int_shr_impl,
        'ii-&gt;i': numbers.int_shr_impl,
        'II-&gt;I': numbers.int_shr_impl,
        'll-&gt;l': numbers.int_shr_impl,
        'LL-&gt;L': numbers.int_shr_impl,
        'qq-&gt;q': numbers.int_shr_impl,
        'QQ-&gt;Q': numbers.int_shr_impl,
    }

    # Inject datetime64 support
    from numba.np import npdatetime
    ufunc_db[np.negative].update({
        'm-&gt;m': npdatetime.timedelta_neg_impl,
    })
    ufunc_db[np.positive].update({
        'm-&gt;m': npdatetime.timedelta_pos_impl,
    })
    ufunc_db[np.absolute].update({
        'm-&gt;m': npdatetime.timedelta_abs_impl,
    })
    ufunc_db[np.sign].update({
        'm-&gt;m': npdatetime.timedelta_sign_impl,
    })
    ufunc_db[np.add].update({
        'mm-&gt;m': npdatetime.timedelta_add_impl,
        'Mm-&gt;M': npdatetime.datetime_plus_timedelta,
        'mM-&gt;M': npdatetime.timedelta_plus_datetime,
    })
    ufunc_db[np.subtract].update({
        'mm-&gt;m': npdatetime.timedelta_sub_impl,
        'Mm-&gt;M': npdatetime.datetime_minus_timedelta,
        'MM-&gt;m': npdatetime.datetime_minus_datetime,
    })
    ufunc_db[np.multiply].update({
        'mq-&gt;m': npdatetime.timedelta_times_number,
        'md-&gt;m': npdatetime.timedelta_times_number,
        'qm-&gt;m': npdatetime.number_times_timedelta,
        'dm-&gt;m': npdatetime.number_times_timedelta,
    })
    if np.divide != np.true_divide:
        ufunc_db[np.divide].update({
            'mq-&gt;m': npdatetime.timedelta_over_number,
            'md-&gt;m': npdatetime.timedelta_over_number,
            'mm-&gt;d': npdatetime.timedelta_over_timedelta,
        })
    ufunc_db[np.true_divide].update({
        'mq-&gt;m': npdatetime.timedelta_over_number,
        'md-&gt;m': npdatetime.timedelta_over_number,
        'mm-&gt;d': npdatetime.timedelta_over_timedelta,
    })
    ufunc_db[np.floor_divide].update({
        'mq-&gt;m': npdatetime.timedelta_over_number,
        'md-&gt;m': npdatetime.timedelta_over_number,
    })

    ufunc_db[np.floor_divide].update({
        'mm-&gt;q': npdatetime.timedelta_floor_div_timedelta,
    })

    ufunc_db[np.equal].update({
        'MM-&gt;?': npdatetime.datetime_eq_datetime_impl,
        'mm-&gt;?': npdatetime.timedelta_eq_timedelta_impl,
    })
    ufunc_db[np.not_equal].update({
        'MM-&gt;?': npdatetime.datetime_ne_datetime_impl,
        'mm-&gt;?': npdatetime.timedelta_ne_timedelta_impl,
    })
    ufunc_db[np.less].update({
        'MM-&gt;?': npdatetime.datetime_lt_datetime_impl,
        'mm-&gt;?': npdatetime.timedelta_lt_timedelta_impl,
    })
    ufunc_db[np.less_equal].update({
        'MM-&gt;?': npdatetime.datetime_le_datetime_impl,
        'mm-&gt;?': npdatetime.timedelta_le_timedelta_impl,
    })
    ufunc_db[np.greater].update({
        'MM-&gt;?': npdatetime.datetime_gt_datetime_impl,
        'mm-&gt;?': npdatetime.timedelta_gt_timedelta_impl,
    })
    ufunc_db[np.greater_equal].update({
        'MM-&gt;?': npdatetime.datetime_ge_datetime_impl,
        'mm-&gt;?': npdatetime.timedelta_ge_timedelta_impl,
    })
    ufunc_db[np.maximum].update({
        'MM-&gt;M': npdatetime.datetime_maximum_impl,
        'mm-&gt;m': npdatetime.timedelta_maximum_impl,
    })
    ufunc_db[np.minimum].update({
        'MM-&gt;M': npdatetime.datetime_minimum_impl,
        'mm-&gt;m': npdatetime.timedelta_minimum_impl,
    })
    # there is no difference for datetime/timedelta in maximum/fmax
    # and minimum/fmin
    ufunc_db[np.fmax].update({
        'MM-&gt;M': npdatetime.datetime_fmax_impl,
        'mm-&gt;m': npdatetime.timedelta_fmax_impl,
    })
    ufunc_db[np.fmin].update({
        'MM-&gt;M': npdatetime.datetime_fmin_impl,
        'mm-&gt;m': npdatetime.timedelta_fmin_impl,
    })

    ufunc_db[np.remainder].update({
        'mm-&gt;m': npdatetime.timedelta_mod_timedelta,
    })
</pre></body></html>