gpt4 book ai didi

python - 了解自定义数组容器的 numpy.log 和 numpy.sum 的区别

转载 作者:行者123 更新时间:2023-12-04 10:34:34 34 4
gpt4 key购买 nike

我正在按照 the instructions on the SciPy website 为 NumPy 数组创建自定义容器.我编写了以下代码:

  • 创建一个类,NpContainer
  • 为函数定义自定义行为 np.sumnp.log输出一个字符串。

  • import numpy as np

    HANDLED_FUNCTIONS = {}

    class NpContainer:
    def __init__(self, val):
    self.val = val

    def __array__(self):
    return np.array(self.val)

    def __array_function__(self, func, types, args, kwargs):
    if func not in HANDLED_FUNCTIONS:
    raise NotImplementedError()

    return HANDLED_FUNCTIONS[func](*args, **kwargs)

    def implements(np_function):
    def decorator(func):
    HANDLED_FUNCTIONS[np_function] = func
    return func
    return decorator

    @implements(np.sum)
    def sum(a, **kwargs):
    return 'Sum Val: {}'.format(np.sum(a.val, **kwargs))

    @implements(np.log)
    def log(a, **kwargs):
    return 'Log Val: {}'.format(np.log(a, **kwargs))

    我使用以下代码测试代码:

    if __name__ == "__main__":
    container1 = NpContainer(val=np.array([1., 2.]))

    sum_result = np.sum(container1)
    print(sum_result)
    print(type(sum_result))

    log_result = np.log(container1)
    print(log_result)
    print(type(log_result))

    Sum 产生预期的结果。
    Sum Val: 3.0
    <class 'str'>

    然而 np.log返回一个 NumPy 数组而不是字符串。
    [0.         0.69314718]
    <class 'numpy.ndarray'>

    有谁知道为什么 np.log跳过我的自定义函数?任何帮助表示赞赏!

    最佳答案

    好的,所以我想 - 我知道发生了什么。您实现了功能 __array_function__ ,应该适合 np.sum但对于 np.log你应该做 __array_ufunc__ ,因为它是一个通用函数( https://docs.scipy.org/doc/numpy/reference/arrays.classes.html#numpy.class.array_ufunc )。

    它还有一些味道,我建议您在这里查看:

    https://numpy.org/neps/nep-0018-array-function-protocol.html

    现在很奇怪 - 一次 __array_ufunc__已实现,甚至 np.sum将被处理为 ufunc ,这搞乱了 decorator .
    ufunc np.sum 的自动类型转换功能是 np.add ,所以下面会为你做的伎俩 - 虽然我宁愿建议实现 sum()作为 NpContainer 的函数- 所以你可以做 container1.sum()相反

    import numpy as np

    HANDLED_FUNCTIONS = {}

    class NpContainer:
    def __init__(self, val):
    self.val = val

    def __array__(self):
    return np.array(self.val)

    def __array_function__(self, func, types, args, kwargs):
    if func not in HANDLED_FUNCTIONS:
    raise NotImplementedError()

    return HANDLED_FUNCTIONS[func](*args, **kwargs)

    def __array_ufunc__(self, ufunc, method, *args, **kwargs):
    if ufunc not in HANDLED_FUNCTIONS:
    raise NotImplementedError()

    return HANDLED_FUNCTIONS[ufunc](*args, **kwargs)

    def implements(np_function):
    def decorator(func):
    HANDLED_FUNCTIONS[np_function] = func
    return func
    return decorator

    @implements(np.add)
    def sum(a, **kwargs):
    return 'Sum Val: {}'.format(np.sum(a.val, **kwargs))

    @implements(np.log)
    def log(a, **kwargs):
    return 'Log Val: {}'.format(np.log(a.val, **kwargs))

    if __name__ == "__main__":
    container1 = NpContainer(val=np.array([1., 2.]))

    log_result = np.log(container1)
    print(log_result)
    print(type(log_result))

    sum_result = np.sum(container1)
    print(sum_result)
    print(type(sum_result))

    关于python - 了解自定义数组容器的 numpy.log 和 numpy.sum 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249960/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com