热线电话:13121318867

登录
2019-04-15 阅读量: 663
numpy求100以内质数和

1、判断是否为质数

判断一个整数是否为质数比较简单,即除了自身和1以外不可被别的数整除。不过根据数学理论证明,不用从2检查到n,到int(sqrt(n))+1即可,可以提高效率。注意返回值为True或False,方便后续的boolean索引。

def is_prime(num):

if num <= 1:

return False

for i in range(2,int(np.sqrt(num))+1):

if num % i == 0:

return False

return True

2、利用循环

简单粗暴的方式,从1循环到100,一次判断是否为质数,若是质数,则加到ans上,若不是直接跳过。因为%%timeit会执行1000,所以跑完代码就comment out了。

def prime_sum_iter(n=100):

ans = 0

for i in range(1,n+1):

if is_prime(i):

ans += i

return ans

print prime_sum_iter()

# %%timeit

# 1000 loops, best of 3: 253 µs per loop

1060

利用np向量化方法

利用numpy可以向量化,用更简洁的方式遍历所有的元素。向量化的理解,就本例子而言,循环的思想是每次取一个数,对其判断是否为质数;向量化是取这个数组为变量,直接对其所有元素判断是否为质数,然后返回一个同size的数组。由于is_prime()函数本身接受单个integer,如要接受向量、数组等变量,需要对函数进行向量话,is_prime_vec = np.vectorize(is_prime)。

is_prime_vec(np_arr)返回一个布尔型数组,比如np_arr = array([1,2,3,4]);那is_prime_vec(np_arr)返回array([False, True, True, False]),因为2,3是质数,1,4不是。np_arr[is_prime_vec(np_arr)]是布尔索引,简单讲就是返回对应True的元素,这里会返回array([2,3]),因为2,3对应的boolean值为True。之后再sum就实现了和循环一样的功能。

def prime_sum_vect(n=100):

np_arr = np.arange(1,n+1)

is_prime_vec = np.vectorize(is_prime)

return np.sum(np_arr[is_prime_vec(np_arr)])

print prime_sum_vect()

# %%timeit

# 1000 loops, best of 3: 286 µs per loop

1060

0.0000
1
关注作者
收藏
评论(0)

发表评论

暂无数据