2017-03-15 10 views
0

私はこのコードをPythonで記述しました。私はそれが私が見ることができない単純な構文修正であるので、それを説明するつもりはないので、何のために説明するのは役に立たない。科学的なPythonの配列の構文

私が持っている問題は、与えられたdに対して、例えば15の "cuentas"と "e"の値が正しいことです。

私がしたいことは、一連のdを繰り返し、各キューンタと各eの値をプロットしてd vs eをプロットすることです。

私の問題は、私がどのようにPythonで行列を作るのか分からないということです。 MATLABで

iがtheeseような二つの異なるループを記述するために使用される:

for i=1:1:N 
    for j=1:9 

     a[i,j]= and so on 

[I、J]はiがアクセスして操作できるN行9列の行列であろう。私は距離によってさえ読んものにそんなに

import numpy as np 
import matplotlib.pyplot as plt 
N=100000 
cos=np.zeros(N) 
phi=np.zeros(N) 
teta=np.zeros(N) 
a=np.zeros(N) 


xrn=np.zeros(N) 
yrn=np.zeros(N) 
zrn=np.zeros(N) 

x=np.zeros(N) 
y=np.zeros(N) 
z=np.zeros(N) 

lim1=14.7 
lim2=3.35 
lim3=-lim1 
lim4=-lim2 

#d=np.array([15,20,25,30,35,40,45,50,55]) 
d=15 

    #for j in range(9): 
for i in range(N): 
    cos[i]=np.random.uniform(-1,1) 
    teta[i]=np.random.uniform(-np.pi,np.pi) 
    phi[i]=np.random.uniform(0,2*np.pi) 

# a[i]=d[j]/cos[i]*np.cos(phi[i]) 
a[i]=d/cos[i]*np.cos(phi[i]) 


xrn[i]=np.random.uniform(-1,1)*lim1 
yrn[i]=np.random.uniform(-1,1)*lim2 

x[i]=a[i]*np.sin(teta[i])*np.cos(phi[i])+xrn[i] 
y[i]=a[i]*np.sin(teta[i])*np.sin(phi[i])+yrn[i] 

#cuentas[j]=0 
cuentas=0 

#for j in range(9): 
for i in range(N): 
    if a[i]>0 and x[i] < lim1 and x[i]>lim3 and y[i] < lim2 and y[i]>lim4: 
     cuentas=cuentas+1 
#e[j]=cuenta[j]/N 
e=cuentas/N 

感謝を反復処理したい。ここで、iはintentionaly#コメントを置くの下に私のコードで

!!

+1

スクリプトが生成すると思われる出力を正確に理解できますか?いかなる間違いもないようです – tel

答えて

1

ショートバージョンです:

これは、MATLABコードの完全に同等ですPythonで

a = np.zeros([N, 9]) 
for i in range(N): 
    for j in range(9): 
     a[i,j]= and so on 

唯一の大きな違いは、あらかじめ配列を定義する必要があることです。これは、MATLABでコードを適切なパフォーマンスにしたい場合には、実際に実行する必要があります。

しかし、あらかじめサイズがわからない場合は、リストをPythonで使用して、最後にnumpyの配列に変換することができます。これは、リストと行列/配列がどのように扱われるかの内部の大規模な配列のためのあなたのMATLABの例よりも、はるかに高速になります。

a = [] 
for i in range(N): 
    a.append([]) 
    for j in range(9): 
     a[-1].append(and so on 
a = np.array(a) 

[-1]手段(「aの最後の要素」、およびappendリストの末尾に括弧の中にあるものは何でも入れSoがa[-1].append(foo)は「aの最後の要素にあるものの内側fooを置く意味

ロングバージョン:。。

あなたのMATLABコードは、Python、Rで動作します同じように、しかしあなたが考慮する必要があるいくつかの顕著な違いがあります。

最初に、既存の配列/マトリックスよりも大きいインデックスに割り当てることは、MATLABでは機能しますが、numpyでは機能しません。したがって、サイズが[5, 5]の配列/行列の場合、MATLABでは[5, 6]という要素に割り当てることができますが、numpyではできません。つまり、MATLABでは空の配列で開始できますが、numpyでは配列のサイズをあらかじめ設定する必要があります。MATLAB行列のサイズは実際には変更できません。実際には、ループごとに新しい行列を作成し、すべてのデータをその行列にコピーしています。これは非常に遅いため、MATLABは配列の事前割り付けを警告します。 Numpyは配列のサイズを変更することができないので、コピー、事前割り振り、リスト(サイズ変更可能)の使用についてもっと明示する必要があります。

第2に、同様に、MATLABでは、numpyは使用する前にマトリックスを定義する必要はありません。これは、伝統的にMATLABには3つのデータ構造(行列、セル配列、構造体)があり、それぞれ独自の索引付けスタイルを持っているからです。そのため、MATLABは、索引作成方法から作成するデータ構造の種類を把握することができます。 Pythonには1つのスタイルの索引付けしかないので、このような推測をすることはできません。

第3に、MATLABの一部の配列(すべてではない)を使用すると、そのサイズの各次元を持つ2D正方行列が作成され、numpyでは1D配列が作成されます。私はあなたのコードから、それがあなたが期待しているかどうかわからない。率直に言って、なぜこのようにMATLABが動作するのかわかりません。

numpy配列は、0(スカラー)、1(ベクトル)、2,3,4などの任意の数のディメンションを持つことができます。一方、MATLABマトリックスは少なくとも2つの次元を持つ必要があります。これは、いくつかの予期せぬ違いを引き起こす可能性があります。

あなたのPythonコードでは、何がうまくいかないと言っていなくても、私はそれを修正する方法を教えてくれません。しかし、うまくいけば私はそれをあなた自身で行うための十分な情報を与えてくれました。

1

あなたは次のようにnumpyのを使用してPythonで行列を作成することができます。

n=5 
k=4 
a=np.zeros([n,k]) 
for i in range(n): 
    for j in range(k): 
     a[i,j]=i+j 
print(a) 

結果が

[[ 0. 1. 2. 3.] 
[ 1. 2. 3. 4.] 
[ 2. 3. 4. 5.] 
[ 3. 4. 5. 6.] 
[ 4. 5. 6. 7.]] 
0

私はあなたの答えを採用し、それは働いた!

誰もが卵形検出器を通過する粒子の数をモンテカルロシミュレーションで知ることができます。私は、検出器1からの粒子を投げるとしてそれは彼らがそれを通過自明である、と私は検出器に渡す数をカウント2.

修正されたコードは、すべての人に

N=100000 
"La dirección viene dada por v=[rsin(teta)*cos(phi),rsin(teta)sin(phi),rcos(teta)]" 
"Los vectores que vamos a usar debemos inicializarlos como un vector de ceros" 
cos=np.zeros([10,N]) 
phi=np.zeros([10,N]) 
teta=np.zeros([10,N]) 
a=np.zeros([10,N]) 

xrn=np.zeros(N) 
yrn=np.zeros(N) 
zrn=np.zeros(N) 

x=np.zeros([10,N]) 
y=np.zeros([10,N]) 
z=np.zeros([10,N]) 

lim1=14.7 
lim2=3.35 
lim3=-lim1 
lim4=-lim2 
"d son las disversas distancias a las que colocamos la fuente con respecto al detector" 

d=np.array([0.00001,15,20,25,30,35,40,45,50,55]) 

"e es la eficiencia geométrica simulada" 
e=np.zeros(10) 

"Debemos definir el coseno como números aleatorios en vez de el ángulo teta, debido a que queremos" 
"que se distribuyan uniformemente por toda la esfera" 
for j in range(10): 
    for i in range(N): 
     cos[j,i]=np.random.uniform(0,1) 

     phi[j,i]=np.random.uniform(0,2*np.pi) 

     a[j,i]=d[j]/cos[j,i] 

     xrn[i]=np.random.uniform(-1,1)*lim1 
     yrn[i]=np.random.uniform(-1,1)*lim2 

     x[j,i]=a[j,i]*np.sin(math.acos(cos[j,i]))*np.cos(phi[j,i])+xrn[i] 
     y[j,i]=a[j,i]*np.sin(math.acos(cos[j,i]))*np.sin(phi[j,i])+yrn[i] 


cuentas=np.zeros(10) 
for j in range(10): 
    for i in range(N): 
     if a[j,i]>0 and x[j,i] < lim1 and x[j,i]>lim3 and y[j,i] < lim2 and y[j,i]>lim4: 
      cuentas[j]=cuentas[j]+1 

    e[j]=cuentas[j]/N 

感謝です!

関連する問題