/ / Existuje viac pythonický spôsob písania - polia, python-2.7, numpy, scipy, besselove funkcie

Existuje viac pytónického spôsobu písania - array, python-2.7, numpy, scipy, bessel-functions

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).