2017-03-15 8 views
0

그래서이 코드는 파이썬으로 작성되었습니다. 나는 그것이 보이는 것을 볼 수없는 간단한 문법 수정이므로 설명하지 않을 것이다. 그래서 무엇이 필요한지를 설명하는 것은 쓸모가 없다.과학 파이썬 배열 구문

내가 가진 문제는 주어진 d에 대해, 예를 들어 "cuentas"값과 "e"가 정확하다는 것입니다.

내가 원하는 것은 각각의 큐의 값을 구하고, 각각의 값을 구하는 것이다.

제 문제는 파이썬에서 행렬을 만드는 방법을 얻지 못하는 것입니다.

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

     a[i,j]= and so on 

는 [내가 j]가 i가 액세스하여 조작 할 수 N 행 9 열 행렬 것이다 :

은 매트랩 난 theese 같은 두 개의 상이한 루프를 작성하는 데 사용. 내 코드에서

내가

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 

감사의 거리를 통해도 읽는 사람들에게 너무 많이 반복 할 위치 내가 intentionaly # 주석을 넣어 아래!

+1

스크립트가 생성 할 것으로 예상되는 출력을 정확하게 정의 할 수 있습니까? 어떤 명백한 오류도없는 것 같습니다. – tel

답변

1

짧은 버전 Python에서

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

유일한 큰 차이점은 배열을 미리 정의해야한다는 것입니다. 코드를 합리적인 성능으로 유지하려면 MATLAB에서 실제로 수행해야하는 배열을 미리 정의해야합니다.

그러나 미리 크기를 모르는 경우에는 파이썬에서 목록을 사용한 다음 끝에 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 목록의 끝에 괄호 안에 무엇이든 넣 겠어요 - a[-1].append(foo)는 "a의 마지막 요소에 어떤 내부 foo를 넣어 의미

긴 버전 :..

귀하의 MATLAB 코드를 파이썬 연구에서 작동합니다 거의 동일한 방식이지만, 고려해야 할 몇 가지 주목할만한 차이점이 있습니다.

먼저 기존 배열/행렬보다 큰 인덱스에 할당하면 MATLAB에서는 작동하지만 numpy에서는 작동하지 않습니다. 따라서 배열/행렬 크기가 [5, 5] 인 경우 MATLAB에서 [5, 6] 요소에 할당 할 수 있지만 numpy는 사용할 수 없습니다. 이것은 MATLAB에서 빈 배열로 시작할 수 있음을 의미합니다. numpy에서는 미리 배열 크기를 설정해야합니다.MATLAB 행렬은 실제로 크기를 조정할 수 없습니다. 실제로 루프를 통과 할 때마다 새 행렬을 만들고 모든 데이터를 복사합니다. 이것은 매우 느리기 때문에 MATLAB이 배열을 미리 할당하도록 경고합니다. Numpy는 배열의 크기를 조정할 수있는 척하지 않으므로 복사, 미리 할당 또는 목록 (크기 재조정 가능) 사용에 대해보다 명확하게 설명해야합니다.

마찬가지로 MATLAB은 사용하기 전에 매트릭스를 정의 할 필요가 없으며 numpy는 사용하지 않습니다. 그 이유는 전통적으로 MATLAB은 3 가지 데이터 구조 (행렬, 셀 배열 및 구조체)를 가지고 있으며 각 데이터 구조는 고유 한 색인 스타일을 가지고 있기 때문입니다. 따라서 MATLAB은 색인을 생성하는 방법부터 작성하려는 데이터 구조의 종류를 파악할 수 있습니다. 파이썬은 하나의 색인 스타일 만 가지고 있기 때문에 이런 추측을 할 수는 없습니다.

세 번째로, MATLAB의 일부 배열 크기를 사용하여 일부 크기 (모든 것은 아님)를 사용하여 크기가 각 차원 인 2D 정사각형 행렬을 만들고 numpy에서 1D 배열을 만듭니다. 그것이 당신이 기대하는 것과 그렇지 않은지 나는 당신의 코드로부터 확신 할 수 없다. 솔직하게 나는 왜 이런 식으로 MATLAB이 작동하는지 전혀 모른다.

넷째, numpy 배열은 0 (스칼라), 1 (벡터), 2, 3, 4 등의 임의의 수의 차원을 가질 수 있습니다. 반면에 MATLAB 행렬은 적어도 2 개의 차원을 가져야합니다. 이것은 예기치 않은 차이를 일으킬 수 있습니다. 예를 들어, numpy 벡터에 대해서는 아무 것도하지 않습니다.

파이썬 코드에 관해서는 무엇이 잘못 될지 말하지 않고 어떻게 해결할지를 말할 수 없습니다. 그러나 희망을 갖고 나는 너에게 너 자신을하기에 충분한 정보를 주었다.

1

다음과 같은 방법으로 NumPy와 사용 파이썬에서 매트릭스를 만들 수 있습니다

이것은 당신의 MATLAB 코드의 정확한 동등은 다음과 같습니다

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 

감사합니다!