Numpy 求100以内质数和

一百以内质数之和

判断是否为质数

判断一个整数是否为质数比较简单,即除了自身和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

利用循环

简单粗暴的方式,从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)。

np.vectorize: Define a vectorized function which takes a nested sequence of objects or numpy arrays as inputs and returns a numpy array as output,具体可参考文档

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 条评论
登录 后参与评论

相关文章

来自专栏图像识别与深度学习

2018-07-02Python数组

1053
来自专栏竹清助手

【机器学习】 搭建模型第一步:你需要预习的NumPy基础都在这了

NumPy 主要的运算对象为同质的多维数组,即由同一类型元素(一般是数字)组成的表格,且所有元素通过正整数元组进行索引。在 NumPy 中,维度 (dimens...

1114
来自专栏静默虚空的博客

排序二 快速排序

要点 快速排序是一种交换排序。 快速排序由C. A. R. Hoare在1962年提出。 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左...

1776
来自专栏编程

Kotlin学习之高阶函数和Lambda表达式:闭包

Kotlin学习之高阶函数和Lambda表达式:闭包 一、闭包 闭包指Lambda表达式和匿名函数外部定义的局部变量,Kotlin支持Lambda表达式和匿名函...

18410
来自专栏杂七杂八

numpy科学计算包的使用1

Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形...

3705
来自专栏编程理解

动态规划(一):爬楼梯

时,处于原地,因为步长为 1 ~ 2 阶,不能有前进之后再后退的情况,所以只能有当前一种方式,所以

762
来自专栏专知

Numpy教程第1部分 - 阵列简介(常用基础操作总结)

【导读】这里是numpy教程的基础部分,涵盖了使用numpy的ndarrays执行数据操作和分析的一些操作。众所周知,Numpy是Python中最基本和最强大的...

2624
来自专栏深度学习之tensorflow实战篇

Python—numpy模块下函数介绍(一)numpy.ones、empty等

NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的...

4306
来自专栏云瓣

探寻 JavaScript 精度问题

阅读完本文可以了解到 0.1 + 0.2 为什么等于 0.30000000000000004 以及 JavaScript 中最大安全数是如何来的。

632
来自专栏黄Java的地盘

正则表达式之进阶篇

本文主要通过介绍正则表达式中的一些进阶内容,让读者了解正则表达式在日常使用中用到的比较少但是又比较重要的一部分内容,从而让大家对正则表达式有一个更加深刻的认识。

663

扫码关注云+社区