Есть ли более питонный способ написать

Научиться быть питоном в 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

1 ответ

Решение

Что на самом деле означает "более Pythonic" здесь. Одним из основных принципов Python является удобочитаемость, поэтому, если нет реальной причины производительности, чтобы избавиться от циклов, просто сохраните их.

Если вы действительно хотите увидеть другие способы сделать то же самое, то:

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

можно заменить на:

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

что немного быстрее (1,35 мс против 1,77 мс), но, вероятно, менее Pythonic и

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

может быть заменено

np.cumsum(z < big,axis=1)[:,-1]

Я бы сказал, что это более Pythonic (или numpythonic) и гораздо быстрее (20 против 212 против нас).

Другие вопросы по тегам