Naučiť sa byť pythonickým v 2.7. Existuje spôsob, ako sa vyhnúť explicitnej slučke? odpoveď = [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
odpovede:
5 pre odpoveď č. 1Čo tu znamená „viac Pythonic“. Jednou z hlavných myšlienok Pythonu je čitateľnosť, takže ak neexistuje skutočný dôvod na výkon slučiek, jednoducho ich udržujte.
Ak ste naozaj chceli vidieť iné spôsoby, ako urobiť to isté, potom:
z = np.zeros((nmax+1, mmax))
for i in range(nmax+1):
z[i] = spe.jn_zeros(i, mmax)
mohol byť nahradený:
func = lambda i:spe.jn_zeros(i,mmax)
np.vstack(np.vectorize(func, otypes=[np.ndarray])(np.arange(nmax+1)))
čo je o niečo rýchlejší (1,35 ms vs. 1,77 ms), ale pravdepodobne menej Pythonic a
[np.max(np.where(z[i]<big))+1 for i in range(nmax+1)]
by mohol byť nahradený
np.cumsum(z < big,axis=1)[:,-1]
čo by som tvrdil, je viac Pythonic (alebo numpythonic) a oveľa rýchlejší (20 us vs. 212 us).