4

まず、数値計算でオブジェクト指向アプローチを使用することが一般的に良い方法であるかどうかを知りたいです。

第 2 に、OO の可能な使用例は、モデルのパラメータをオブジェクトにカプセル化することです。たとえば、ax^2 + bx +c の形の放物線を調べたいとします。したがって、a、b、c を何らかの Parabola オブジェクトにカプセル化します。私はそれをプロットすることができます。さて、放物線の縦軸の位置を調べたいとしましょう。基本的に、OO がなければ、c のいくつかの与えられた値に対して、a と b (2 つの numpy 配列) に関するすべての垂直軸位置の表面をプロットすることができます。

私の質問は、派手なパフォーマンスを (あまり) 犠牲にすることなく、追加の OO レイヤーを使用してそのような表面プロットを行うにはどうすればよいですか?

補足説明

OO アプローチを使用する方法は、パラメーター a と b の値の範囲に対して Parabola オブジェクトのマトリックスを作成することです。しかし、この方法では、パラメーター範囲の単純な numpy 配列ではなく、非常に大きなオブジェクトを処理する可能性があります。

4

2 に答える 2

4

numpyを使用することによるパフォーマンス上の利点のほとんどすべてが失われるため、オブジェクトの配列を使用しないことをお勧めします。次のように構造化またはコーディングします。

class Points:

    def __init__(self, x, y):
        self.x = np.asarray(x)
        self.y = np.asarray(y)

    def shift_left(self, distance):
        self.x -= distance

x = np.zeros(10000)
y = np.zeros(10000)

points_obj = Points(x, y)

これで、関数やメソッドなどを作成できます。これらの関数やメソッドなどは、それを認識して動作し、numpypoints_obj配列(サイズ1、またはそれ以上)である可能性があります。points_objにインデックスを付ける必要がある場合は、いつでもクラスでメソッドを定義できます。points_obj.xpoint_obj.y__getitem__

于 2012-09-20T19:33:50.833 に答える
2

オブジェクト指向の有無にかかわらず、同じ数値アルゴリズムを使用できます。あなたの質問がよくわかりません。オブジェクト指向は、プログラムの構造とデータ間の接続に関するものです。メソッド内の数値は、通常の手続き型プログラムと同じにすることができます。 - 編集 -

メソッドをベクトル化すると、放物線の配列を非常に迅速に作成できます。もちろん、もっと複雑なものをベクトル化することもできます。

import numpy as np

class parabola:
    a = 0.0
    b = 0.0
    c = 0.0
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c
    def set_a(self, new_a):
        self.a = new_a
    def set_b(self, new_b):
        self.b = new_b
    def set_c(self, new_c):
        self.c = new_c
    def get_a(self):
        return self.a
    def get_b(self):
        return self.b
    def get_c(self):
        return self.c

vpara = np.vectorize(parabola)
vgeta = np.vectorize(parabola.get_a)
vgetb = np.vectorize(parabola.get_b)
vgetc = np.vectorize(parabola.get_c)


a = np.zeros(10000)
b = np.zeros(10000)
c = np.zeros(10000)
a[:]  = [i for i in xrange(10000)]
b[:]  = [2*i for i in xrange(10000)]
c[:]  = [i*i for i in xrange(10000)]

objs = np.empty((10000), dtype=object)
objs[:] = vpara(a,b,c)

print vgeta(objs[1:10:2]),vgetc(objs[9900:9820:-3])
于 2012-09-19T20:54:52.233 に答える