2017-02-17 3 views
1

私は異なる長さの2つの配列(aとb)を持っています。私も重みのセットを持っているので、xに等しいa + bの重み付けされた組み合わせを見つける必要があります。重みの合計は常に等しい1xと等しい長さの配列の重み付けされた組み合わせを見つけるにはどうすればよいですか?

なければならない私は、次のことを試してみました:

import numpy as np 

a = np.arange(1.2, 1.7, 0.1) 
b = np.arange(0.0, 0.9, 0.1) 
x = 0.6 
weights = np.arange(0.05, 1.05, 0.05) 

a.resize(b.shape) 

lw = [] 
for w in weights: 
    for y in weights: 
     np.where((w * a + y * b) == x, lw.append(w), np.nan) 

これは私の20の* 20の重みのリスト、すなわち、すべての重みを与えます。

私は重みを持つリスト必要があります:私はこれを行うことができますどのように* A +のy * bの= X

ワット任意のアイデアを?

+0

ド: 'np.argwhere(np.isclose((重み[:なし、なし] * A)+(重み[:なし] * b)に示すように、 x)) 'を実行し、最初の2つの列を重み付けに使用し、最後の列は' a'と 'b'の対応する要素をIDで識別します。 – Divakar

+0

@Divakar重みの合計が常に1に等しくなければならないことを忘れていました。上記の質問に追加されました。 – cJc

答えて

1

IIUCがここに一つのアプローチだ -

ここ
sums = weights[:,None, None, None] * a[:,None] + weights[:,None,None]*b 
idx = np.argwhere(np.isclose(sums,x)) 
out_idx = idx[np.isclose(weights[idx[:,0]] + weights[idx[:,1]], 1)] 

、最初の2つの列がweightsのインデックスの組み合わせであり、最後の2列は、それぞれabための指標です。

が所与の試料について確認 -

In [165]: sums = weights[:,None, None, None] * a[:,None] + weights[:,None,None]*b 

In [166]: idx = np.argwhere(np.isclose(sums,x)) 

In [167]: out_idx = idx[np.isclose(weights[idx[:,0]] + weights[idx[:,1]], 1)] 

In [168]: out_idx 
Out[168]: 
array([[ 1, 17, 3, 5], 
     [ 3, 15, 2, 4], 
     [ 4, 14, 0, 4], 
     [ 4, 14, 3, 3], 
     [ 4, 14, 5, 8], 
     [ 4, 14, 6, 8], 
     [ 4, 14, 7, 8], 
     [ 4, 14, 8, 8], 
     [ 5, 13, 1, 3], 
     [ 7, 11, 0, 2], 
     [ 7, 11, 3, 0], 
     [ 9, 9, 0, 0]]) 

In [169]: weights[1]*a[3] + weights[17]*b[5] 
Out[169]: 0.60000000000000009 

In [170]: weights[3]*a[2] + weights[15]*b[4] 
Out[170]: 0.60000000000000009 

In [171]: weights[1] + weights[17] 
Out[171]: 1.0000000000000002 

In [172]: weights[3] + weights[15] 
Out[172]: 1.0 
+0

1つの質問ですが、なぜidxの最後の列がaとbの両方にありますか?これが私の明快さ/知識の欠如のために誤解である場合にはお詫びしますが、aとbの組み合わせは結果がxであれば動作します。 – cJc

+0

@cJc私の考えは、特定の「a」とそれに対応する値「b」とを比較すると、「w * a + y * b = x」となる。それとも、「a」と「b」の組み合わせを別々に取る必要があるのでしょうか?両方の条件を満たす「a」と「b」という重みのサンプルの組み合わせを1つ与えてもらえますか? – Divakar

+0

@cJcまた、あなたのコードでは、あなたは 'w * a + y * b'を持っています。今、 'w'はスカラですが、' a'と 'b'は1D配列です。したがって、 'w * a + y * b'は1次元配列になります。そして、あなたはそれをスカラーである 'x'と同じにします。意味すると思われるものは何ですか? – Divakar

関連する問題