首页 > 解决方案 > numpy vs. python:修补圆形函数

问题描述

我有一个文件,它定义

def foo(x):
   return round(x)

round是pythonbuilt-in函数。

现在,我想用一个 numpy 数组调用这个函数。Numpy 也有一个round功能。不幸的是,有一些问题(例如#11557

import numpy as np

foo(7.6)
foo(np.array([7.6]))       # works with python2 + np_1.14.0, not with 3.6.9 + np_1.14.5
foo(np.array([7.6, 8.9]))  # TypeError: type numpy.ndarray doesn't define __round__ method

是否有可能用函数round内部np.round替换foo函数?round = np.round导入前或导入后的一些补丁foo.round = np.round

编辑:我正在寻找不修改文件的解决方案。

标签: pythonnumpy

解决方案


子类是一种解决方法(正如@Anton Pomieshchenko 评论的那样)

class Array(np.ndarray):
    def __new__(cls, array, **kwargs):
        return np.asarray(array, **kwargs).view(cls)
    def __round__(self):
        return np.round(self.data)

foo(Array([7.6, 8.9]))

适用于 python 3,而在 python 2 中我得到TypeError: only size-1 arrays can be converted to Python scalars.

我没有成功我也尝试过np.__round__ = np.round(TypeError:只有 size-1 数组可以转换为 Python 标量)或np.ndarray.__round__ = np.round(TypeError:无法设置内置/扩展类型'numpy.ndarray'的属性)。


推荐阅读