2017-05-15 7 views
-1

これは、FortranやBasic、さらにはMatlabでも些細なことですが、Python + Numpyで動作させることはできません。私は多くの提案と例を試しましたが、この問題を解決するには単純すぎます。擬似コードは次のとおりです。Pythonでの2つのベクトルの乗算

Given a vector a(i) with 500 values. 
for i=1 to 500 
    b(i) = some complicated math 
    c(i) = a(i) * b(i) 

これはPythonとNumpyでどのように書かれますか?

+1

あなたは[外積](https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.cross.html)または[ドットを探しています製品](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)? –

+2

... [要素別の製品](https://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html)? –

+0

@FredLarsonが提供された擬似コードで判断すると、それは要素単位( 'c(i)= a(i)* b(i)')になります。 – Uriel

答えて

0

私はあなたが要素単位ベクトル積を得るためにnumpyのmultiplyfunctionを使用することができ、この

import numpy as np 

n = 500 

# Allocate memory for a, b, c 
a = np.zeros((n)) 
b = np.zeros((n)) 
c = np.zeros((n)) 

# Loop over element 
for i in range(n): 
    b[i] = some complicated math 
    c[i] = a[i] * b[i] 
2

ような何かをしようとするだろう。数学演算(*+)が自動的にbのすべての要素に適用されることを

import numpy as np 

a = np.arange(500) 
b = 10 * np.arange(500) + 3 # an example of the "complex math" 
c = np.multiply(a, b) 

注:このような何かを試してみてください。

1

「複雑な数学」をベクトル化できるかどうか、それが1行か複数かどうかによって異なります。それはベクトル化し、より複雑なソリューションであり、いくつかの行を、取ることができない場合、あなたはこのような何か行うことができます。この例では

b = np.zeros_like(a) 
for i, ai in enumerate(a): 
    b[i] = some_complicated_math(ai) 
c = a*b 

を、iaaiの現在のインデックスが時の値でありますそのインデックス(a[i]に相当)。 enumerateには値とその(1D)インデックスが表示されます。 numpy配列での乗算は自動的に要素単位で行われます。

「複雑な数学は」ベクトル化することはできませんが、1本のライン上で行うことができるならば、あなたはこのような何か行うことができます。この場合

b = [some_complicated_math(ai) for ai in a] 
c = a*b 

bリスト(ないnumpyの配列)でありますしかし、pythonはnum37の配列aで乗算されているので、bを背後のnumpy配列に変換するほどスマートです。後で必要な場合はnp.array(b)を使用してbをnumpy配列に変換できます。

最も単純なシナリオは、「複雑な数学」をベクトル化できる場合です。次に、あなただけ行うことができます。

b = some_complicated_math(a) 
c = a*b 

どんな理由であれ、あなたは(b参照c何とかならば私は考えることができる唯一の理由は次のようになります)ループ内でbcを配置する必要があり、場合は、行うことができますこの:

b = np.zeros_like(a) 
c = np.zeros_like(a) 
for i, ai in enumerate(a): 
    b[i] = some_complicated_math(ai) 
    c[i] = a[i]*b[i]