Python 如何矢量化`\uuu调用``方法

Python 如何矢量化`\uuu调用``方法,python,vector,numpy,Python,Vector,Numpy,我跟随,教程。我正在尝试这个练习,我应该使用矢量化的numpy方法实现一个 以下是问题的正确解决方案: class ecdf: def __init__(self, observations): self.observations = np.asarray(observations) def __call__(self, x): return np.mean(self.observations <= x) def plot(s

我跟随,教程。我正在尝试这个练习,我应该使用矢量化的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()
我得到这个错误:

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)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
p([0.2,0.3])
文件“D:/Users/y_-arabaci-ug/Desktop/quant-econ/programs/numpy_exercises.py”,第50行,在调用中__

返回np.mean(self.observations您不能这样做,因为
\uuu call\uu
必须是类
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)
类ecdf(对象):
定义初始(自我,观察):
self.observations=np.asarray(观察值)
self.\u v\u calc=np.矢量化(self.\u calc)
def_计算(自身,x):

返回np.mean(self.observations您不能这样做,因为
\uuu call\uu
必须是类
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)
类ecdf(对象):
定义初始(自我,观察):
self.observations=np.asarray(观察值)
self.\u v\u calc=np.矢量化(self.\u calc)
def_计算(自身,x):

返回np.mean(self.observations)我不知道您的解决方案是否能以某种方式工作,但我不会让
\uuuu init\uuuu
(在对象端)修改它从自己的类(在类型端)获得的函数的定义.IMHO,这应该通过一个元类来完成。我不知道您的解决方案是否能以某种方式工作,但我不会让
\uuuu init\uuuu
(在对象端)修改它从自己的类(在类型端)获得的函数的定义。IMHO,这应该通过一个元类来完成。
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)