python - 如何向量化 `__call__`方法

标签 python vector numpy

我正在关注,quant-econ教程。我正在尝试进行练习,我应该实现 Empirical Cumulative Probability Funcion使用矢量化 numpy 方法。

这是问题的正确解决方案:

class ecdf:

    def __init__(self, observations):
        self.observations = np.asarray(observations)

    def __call__(self, x): 
        return np.mean(self.observations <= x)

    def plot(self, a=None, b=None): 

        # === choose reasonable interval if [a, b] not specified === #
        if not a:
            a = self.observations.min() - self.observations.std()
        if not b:
            b = self.observations.max() + self.observations.std()

        # === generate plot === #
        x_vals = np.linspace(a, b, num=100)
        f = np.vectorize(self.__call__)
        plt.plot(x_vals, f(x_vals))
        plt.show()

但我尝试这样做:

class ecdf(object):

    def __init__(self, observations):
        self.observations = np.asarray(observations)
        self.__call__ = np.vectorize(self.__call__)

    def __call__(self, x):
        return np.mean(self.observations <= x)

因此,__call__ 方法被矢量化,并且可以使用数组调用实例,并返回该数组的累积概率数组。但是,当我这样尝试时:

p = ecdf(uniform(0,1,500))
p([0.2, 0.3])

我收到此错误:

Traceback (most recent call last):

  File "<ipython-input-34-6a77f18aa54e>", line 1, in <module>
    p([0.2, 0.3])

  File "D:/Users/y_arabaci-ug/Desktop/quant-econ/programs/numpy_exercises.py", line 50, in __call__
    return np.mean(self.observations <= x)

ValueError: operands could not be broadcast together with shapes (500) (2)

我的问题是,为什么作者可以矢量化 self.__call__ 并且它有效,而我的方法却给出了错误?

最佳答案

你不能这样做,因为 __call__ 必须是类 ecdf 的属性,而不是实例。这是我的解决方案:

class ecdf(object):

    def __init__(self, observations):
        self.observations = np.asarray(observations)
        self._v_calc = np.vectorize(self._calc)

    def _calc(self, x):
        return np.mean(self.observations <= x)

    def __call__(self, x):
        return self._v_calc(x)

关于python - 如何向量化 `__call__`方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19990863/

相关文章:

python - 重组DataFrame并写入SQL数据库

python - Pandas+seaborn 多维数据框分面

c++ - 大小为 10 的 vector 的测试用例失败

python - 如何使用 numpy 将简单线性回归与梯度下降并行化?

python - 拟合线性回归模型的数值误差

python - 按标签集的成员资格过滤 pandas DataFrame

python递归(分形),具有无理值输出<=>输入,基于斐波那契/phi基础

r - lapply 与 gregexpr 和字符向量

c++ - 关于 vector 的考虑

python - 在 Python 中从文件加载数组数据的最简单方法是什么?