2014-11-15 7 views
1

2.7에서 파이썬으로 배우는 것. 명시 적 루프를 피할 수있는 방법이 있습니까? 대답 = [5, 4, 4, 3, 3, 2]더 쓸모없는 방법이 있습니까

import numpy as np 
import scipy.special as spe 

nmax = 5  # n = 0, 1 ...5 
mmax = 7  # m = 1, 2 ...7 
big = 15. 
z = np.zeros((nmax+1, mmax)) 
for i in range(nmax+1): 
    z[i] = spe.jn_zeros(i, mmax) 
answer = [np.max(np.where(z[i]<big))+1 for i in range(nmax+1)] 
print answer # list of the largest m for each n where the mth zero of Jn < big 
+0

@twasbrillig에서 오류가 발생하여 nmax -> nmax + 1 보정을 포함 시켰습니다. 그런 다음 잘못 적용된 mmax에서 +1을 제거했습니다. – uhoh

+0

... 설명을 추가했습니다. n = 0은 J0 등을 의미하며 첫 번째 0은 원점에있는 것이 아니라는 것을 기억하십시오 (n> 0). – uhoh

답변

5

여기서 "Pythonic"이 실제로 의미하는 것. 파이썬의 핵심 교리 중 하나는 가독성입니다. 따라서 루프를 제거 할 실제 성능상의 이유가 없다면 그냥 유지하십시오. 당신이 정말로 다음 같은 일을 할 수있는 다른 방법을보고 싶어하면

는 :

func = lambda i:spe.jn_zeros(i,mmax) 
np.vstack(np.vectorize(func, otypes=[np.ndarray])(np.arange(nmax+1))) 
약간 빠른

(1.35 MS 대 1.77 :

z = np.zeros((nmax+1, mmax)) 
for i in range(nmax+1): 
    z[i] = spe.jn_zeros(i, mmax) 

로 대체 할 수있다 MS)하지만, 아마도 덜 파이썬과

[np.max(np.where(z[i]<big))+1 for i in range(nmax+1)] 

로 대체 될 수있다
np.cumsum(z < big,axis=1)[:,-1] 

나는 더 Pythonic (또는 numpythonic)과 훨씬 더 빠르다고 주장 할 것입니다 (20 us 대 212 us).

+1

답장을 보내 주셔서 감사합니다 @ebarr. float에서 bool에 이르기까지 12 자로 된 정수는 매우 멋집니다! (자기에게 알림 : 이것은 jn_zeros가 단조롭다는 것을 이용한다) – uhoh