1

方程式の計算を簡素化するライブラリまたは手法はありますか?

次の 2 つの例を見てください。

  • F = B * { [ a * b * sumOf (A / B ''' for all i ''' ) ] / [ sumOf(c * d * j) ] }

    どこ:

    F = i から j までのコスト

    B、a、b、c、d、j はすべて [ [zone_i, zone_j, cost_of_i_to_j], [..]] の形式のベクトルです。

    これにより、ベクトル F [ [1,2, F_1_2], ..., [i,j, F_i_j] ] が生成されます。

  • T_ij = [ P_i * A_i * F_i_j] / [ SumOf [ Aj * F_i_j ] // j = 1 ~ j = n ]

    どこ:

    n はゾーンの数です

    T = ベクトル [ [1, 2, A_1_2, P_1_2], ..., [i, j, A_i_j, P_i_j] ]

    F = ベクトル [1, 2, F_1_2], ..., [i, j, F_i_j]

    したがって、P_i はすべての j のすべての P_i_j の合計になり、Aj はすべての i のすべての P_j の合計になります

何を探しているのかわかりませんが、おそらくこれらの方程式または複数の乗算とベクトル間の積を処理するメソッドのパーサーでしょうか?

A_jなど、いくつかの要因を計算するには、これを使用します

from collections import defaultdict

A_j_dict = defaultdict(float)
for A_item in TG: A_j_dict[A_item[1]] += A_item[3]

これは問題なく機能しますが、変数やパラメーターを追加したい場合には、ブルート フォース/ハッキング手法であり、維持できないと感じています。お勧めの数式パーサーはありますか?

補足:これらの方程式は、移動のモデル化に使用されます。現在、私はこれらの方程式の多くを解くために Excel を使用しています。そして、そのプロセスは気が遠くなるようなものだと思います。私は、データベース (postgres) から直接データを取得し、結果をデータベースに出力する Python に移行したいと考えています。すべてが理解されています。方程式自体の評価に苦労しています。

ありがとう :)

4

3 に答える 3

4

同じ次元の 2 つの NumPy 配列の要素ごとの乗算を行うには、単純に「A * B」です。

In [1]: a = arange(50)

In [2]: b = ones(50) * 2

In [3]: a
Out[3]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])

In [4]: b
Out[4]: 
array([ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
        2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
        2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
        2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.])

In [5]: a * b
Out[5]: 
array([  0.,   2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.,  20.,
        22.,  24.,  26.,  28.,  30.,  32.,  34.,  36.,  38.,  40.,  42.,
        44.,  46.,  48.,  50.,  52.,  54.,  56.,  58.,  60.,  62.,  64.,
        66.,  68.,  70.,  72.,  74.,  76.,  78.,  80.,  82.,  84.,  86.,
        88.,  90.,  92.,  94.,  96.,  98.])

In [6]: (a * b).sum()
Out[6]: 2450.0

行列の乗算の観点から物事を書くことができる場合は、次を使用できますdot()

In [7]: A = arange(25).reshape((5,5))

In [8]: X = arange(5)

In [9]: A
Out[9]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [12]: dot(A, X) # Sum_j A[i,j] * X[j] for all i
Out[12]: array([ 30,  80, 130, 180, 230])

これで始められるはずです。

于 2010-05-26T21:43:00.990 に答える
3

ちなみに、いくつかの数学モジュール、nzmath と mpmath には、Carter が持っている肝臓の丸薬よりも多くのものがあります。

LL

于 2011-11-05T11:13:57.327 に答える
3

この種のタスクに対する一般的なソリューションはNumPyです。

あなたの方程式は、NumPy の配列と行列が非常に役立つはずのベクトルと行列の方程式に十分近いようです。

必要なものに基づく例を次に示します。

T_ij = [ P_i * A_i * F_i_j] / [ SumOf [ Aj * F_i_j ] // j = 1 ~ j = n ]

n はゾーンの数です。

T = ベクトル [ [1, 2, A_1_2, P_1_2], ..., [i, j, A_i_j, P_i_j] ]

F = ベクトル [1, 2, F_1_2], ..., [i, j, F_i_j]

したがって、P_i はすべての j のすべての P_i_j の合計になり、Aj はすべての i のすべての P_j の合計になります

これは、たとえば次のように計算できます。

import numpy as np
A = np.array([…]); P = np.array(…)  # Vectors (1D arrays)
F = np.array([[…], […],…])  # 2D array
T = (P*A*F.T).T/np.dot(F, A)

NumPy のおかげで、最終結果が非常にコンパクトな形式で表現されていることがわかります。NumPy 配列の計算も非常に高速です。

あなたが達成しようとしていることは、NumPy にとって本当に理想的な仕事です。このツールを学習する準備ができている場合は、 Numpy チュートリアルを実行することをお勧めします。

于 2010-05-26T14:07:48.200 に答える