5

I have some data, which is a function of two variables, let's say a and b.

f(a,b)

In maths terms, we can think of f as a surface viewed in 3D. The problem is, what is a good data structure to store this data in? I need to plot f as a function of a for constant b and f as a function of b for constant a. Currently I'm using a dict of arrays, something like this:

  f['a1'] = [b1,b2,b3]

but then if I now want to plot f as a function of a with b constant I have to re-make another dict by hand:

  f['b1'] = [a1,a2,a3]

which is proving extremely cumbersome and makes my code unreadable. Is there a nice way to store such 3D data in some numpy data structure or using built in python data structures?

4

3 に答える 3

5
f['a1'] = [b1, b2, b3]

これがあなたの最初の説明とどのように関連しているのかわかりません。f は2 つの変数の関数だとおっしゃっていましたが、誤解を招くように「b」というラベルを付けたと思います。

通常の Python リストの例

2 次元配列をリストのリストとして簡単に格納できます ( Iliffe ベクトルを参照)。それはあなたに次のことを与えるでしょう:

_f_values = [
        [1, 4, 3],
        [2, 8, 6],
        [0, 7, 5],
    ]
def f(a, b):
    return _f_values[a][b]

numpy の ndarray を使用する

numpy には、多次元の同種配列に特化した型ndarray があります。これは間違いなく速くなります。を使用して行全体または列全体にアクセスできます:

_f_array = numpy.array([
        [1, 4, 3],
        [2, 8, 6],
        [0, 7, 5],
    ])
def f(a, b):
    return _f_array[a, b]
def f_row(a):
    return _f_array[a, :]
def f_col(b):
    return _f_array[:, b]
于 2013-08-22T22:12:25.810 に答える
3

データが実際に 3D 空間のサーフェスである場合、保存の自然な方法は、2 つの独立変数 と の一意の値の 2 つのベクトルaと、 のデカルト積を使用したbへの呼び出しの値を含む 2D 配列を持つことです。 f()2 つのベクトル。ダミーの例として:

def f(a, b) :
    return a + b

a = np.array([1, 3, 9, 15])
b = np.array([6, 18, 32])

# if your function f is vectorized
f_ab = f(a[:, np.newaxis], b)
# if it is not
f_ab = np.empty((len(a), len(b)), dtype=np.array(f(a[0], b[0])).dtype)
for i, a_ in enumerate(a):
    for j, b_ in enumerate(b):
        f_ab[i, j] = f(a_, b_)

aの特定の値、またはの特定の値に対応するデータのスライスを取得できるようになりましたb

>>> f_ab[a == 9, :]
array([[15, 27, 41]])

>>> f_ab[:, b==32]
array([[33],
       [35],
       [41],
       [47]])
于 2013-08-22T22:56:58.347 に答える
2

ndarray が適しているようです。http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.htmlを参照してください

于 2013-08-22T21:54:29.650 に答える