12

Python 初心者、2.7 を実行

次の式をコーディングする Pythonic の方法が見つかりません。私の目標は、値を入力できる単一の関数を用意することです (以前の試みでは、非常に反復的なブルート フォース ソリューションしか見つかりませんでした)。

方式

必要な情報:

シグマ記号の意味がわからない場合は、こちらをご覧ください

# 'v' is the formula
# 'i' 'j' 'k' are actors with numerical attributes 'c' 's' and 'x'
# 'n' = length of the following lists (length is identical for all four lists)

values_1 = [Bob, Sue, Mary, Jo...] # i, j, and k are any 3 values drawn from this list  
                        # under the condition that i != j != k

values_2 = [5,6,7,8...] # c is drawn from this list. 
                        # if i = values_1[0], then c(i) = values_2[0]. 
                        # same for j and k

values_3 = [9,10,11,12...] # s is drawn from this list.  
                        # if i = values_1[0], then s(i) = values_3[0]

values_4 = [13,14,15, 16..] # x is drawn from this list. 
                           # if i = values_1[0], then x(i) = values_4[0].

def V (j,k):
        #this is where I need help!

v_Bob_Sue = # this is where V(Bob, Sue) should go.
            # this is what the math would look like in English:
# SUM of (c_Mary * s_Mary * ((abs(x_Mary - x_Sue) - abs(x_Mary - x_Bob)) / x's range))
# and (c_Jo * s_Jo * ((abs(x_Jo - x_Sue) - abs(x_Jo - x_Bob)) / x's range))

# Bob and Sue are the j and k value
# we do the formula with all the other actors (from values_1) who AREN'T Bob and Sue


v_Bob_Mary = # etc 
v_Bob_Jo = 
v_Sue_Bob =
v_Sue_Mary =
v_Sue_Jo =
v_Mary_Bob =
v_Mary_Sue =
v_Mary_Jo =
v_Jo_Bob =
v_Jo_Sue =
v_Jo_Mary =
4

2 に答える 2

11

「シグマ」は「和」とも呼ばれるので計算がとても簡単です。Pythonにはこのための組み込み関数があります:http://docs.python.org/library/functions.html#sum

あなたが提供する式に関しては、ここで本当に見逃しているのはリストまたは配列だと思います。i、j、およびkは、n次元配列のインデックスにすることができます。私はこれにnumpyパッケージを使用します:

import numpy as np

c = np.asarray(values_2)
s = np.asarray(values_3)
x = np.asarray(values_4)

def V(j, k):
    return np.sum(c * s * (np.abs(x - x[j]) - np.abs(x - x[k])) / np.abs(x[-1] - x[0]))

ここで、BobとSueは、values_1リストのインデックス位置によってエンコードされています。これにより、文字列やクラスインスタンスを操作するよりもはるかに簡単になります。だからあなたは書くでしょう:

v_Bob_Sue = V(0, 1)

変数v_Bob_Sueなどを自動的に作成する場合は、変数名を動的に定義する必要があります。したがって、次のようにexecステートメントが必要です。

for i in xrange(len(values_1)):
    for j in xrange(len(values_1)):
        exec("v_%s_%s = V(%u, %u)" % (values_1[i], values_1[j], i, j)
于 2012-08-06T15:04:39.213 に答える