

動作はしているのですが，メモリを無駄に使用量しているのは明らかですし，他にもっと良い方法があると思うのです．  
知識を貸していただけないでしょうか．したいことは  
data.generate.mu_sigma()  
ようにパラメータを生成したり，変更したりして  
data.mu  
としてデータの参照することです．

理由は  
data.generate＿mu_sigma(self)  
というような方法では，予測補間での検索が大変なことや，  
data.generate.  
data.generate2.  
などを作って別な生成方法を試したりしたいからです

.pyファイルでモジュールとしてあつかえばいいかなとも思いましたが，オブジェクトとして値が保持されなかったりするのかなと考えたりしてしまします．

他にもcの構造体のように型をだけを宣言するクラスと，処理を主に扱うクラスをまとめたクラスなどをつくれたら,うれしいなと思うのですが，不可能でしょうか．

よろしくお願いします．

[code]

    import numpy as np
    class test_data:
        def __init__(self,n_samples,dim):
            class generate:
                def __init__(self,n_samples,dim):
                    self.n_samples = n_samples
                    self.dim = dim
                    self.mu = 0.0
                    self.sigma = 0.0
    
                def mu_sigma(self):
                    self.mu = np.random.uniform(low=-2.0, high=2.0, size=self.dim)
                    self.sigma = np.random.uniform(low=1.0, high=2.0, size=self.dim)
    
            self.n_samples = n_samples
            self.dim = dim
            self.generate = generate(n_samples,dim)
            self.generate.mu_sigma()
            self.mu = self.generate.mu
            self.sigma = self.generate.sigma
    
    data=test_data(n_samples=10,dim=2)
    print(data.generate.mu)
    print(data.mu)
    
[/code]

結果  
[ 0.97730724 1.0678634 ]  
[ 0.97730724 1.0678634 ]


CC BY-SA 3.0
2017-03-31T00:17:23.723
33659
2017-03-31T09:18:17.690
21291
question
python python3
pythonのクラス内クラスについて


なぜクラス内にクラスを定義したいのかよくわかりません。普通に２つのクラスを定義して、test_dataのクラスから、内部に持つgenerateクラスに処理を委譲すれば良いのではないでしょうか。

[code]

    import numpy as np
    
    class GenerateData:
    
        def __init__(self, n_samples, dim):
            self.n_samples = n_samples
            self.dim = dim
    
        @property
        def mu(self):
            return np.random.uniform(low=-2.0, high=2.0, size=self.dim)
    
        @property
        def sigma(self):
            return np.random.uniform(low=-2.0, high=2.0, size=self.dim)
    
    class TestData:
    
        def __init__(self, n_samples, dim):
            self.generate_data = GenerateData(n_samples, dim)
    
        @property
        def mu(self):
            return self.generate_data.mu
    
        @property
        def sigma(self):
            return self.generate_data.sigma
    
    test = TestData(n_samples=10, dim=2)
    
    print(test.mu)
    print(test.sigma)
    
[/code]


CC BY-SA 3.0
2017-03-31T08:46:38.303
33667
2017-03-31T08:46:38.303
2168
33659
answer


参考までに、inner class の代わりに named tuple を返す関数を使う方法などを。

[code]

    import collections
    import numpy as np
    
    class test_data:
      def __init__(self, n_samples, dim, generator):
        self.n_samples = n_samples
        self.dim = dim
        self.generate = generator(n_samples, dim)
        self.mu = self.generate.mu
        self.sigma = self.generate.sigma
    
    def generator(n_samples, dim):
      generate = collections.namedtuple('generate', ['mu', 'sigma'])
      return generate(
        mu = np.random.uniform(low=-2.0, high=2.0, size=dim),
        sigma = np.random.uniform(low=1.0, high=2.0, size=dim))
    
    data = test_data(n_samples=10, dim=2, generator=generator)
    
    print(data.generate.mu)
    print(data.mu)
    
[/code]


CC BY-SA 3.0
2017-03-31T09:18:17.690
33669
2017-03-31T09:18:17.690
33659
answer