1

在 2.7 中学习 Pythonic。有没有办法避免显式循环?答案=[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
4

1 回答 1

5

“更多 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 us vs. 212 us)。

于 2014-11-15T11:09:22.113 回答