1

私は、量的経済のチュートリアルに従っています。ベクトル化された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__、それが機能するのに、私のメソッドはエラーを出すのでしょうか?

4

1 に答える 1