Numpy 求100以內(nèi)質(zhì)數(shù)和

一百以內(nèi)質(zhì)數(shù)之和

判斷是否為質(zhì)數(shù)

判斷一個(gè)整數(shù)是否為質(zhì)數(shù)比較簡(jiǎn)單,即除了自身和1以外不可被別的數(shù)整除。不過(guò)根據(jù)數(shù)學(xué)理論證明,不用從2檢查到n,到int(sqrt(n))+1即可,可以提高效率。注意返回值為True或False,方便后續(xù)的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

利用循環(huán)

簡(jiǎn)單粗暴的方式,從1循環(huán)到100,一次判斷是否為質(zhì)數(shù),若是質(zhì)數(shù),則加到ans上,若不是直接跳過(guò)。因?yàn)?%timeit會(huì)執(zhí)行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可以向量化,用更簡(jiǎn)潔的方式遍歷所有的元素。向量化的理解,就本例子而言,循環(huán)的思想是每次取一個(gè)數(shù),對(duì)其判斷是否為質(zhì)數(shù);向量化是取這個(gè)數(shù)組為變量,直接對(duì)其所有元素判斷是否為質(zhì)數(shù),然后返回一個(gè)同size的數(shù)組。由于is_prime()函數(shù)本身接受單個(gè)integer,如要接受向量、數(shù)組等變量,需要對(duì)函數(shù)進(jìn)行向量話,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)返回一個(gè)布爾型數(shù)組,比如np_arr = array([1,2,3,4]);那is_prime_vec(np_arr)返回array([False, True, True, False]),因?yàn)?,3是質(zhì)數(shù),1,4不是。np_arr[is_prime_vec(np_arr)]是布爾索引,簡(jiǎn)單講就是返回對(duì)應(yīng)True的元素,這里會(huì)返回array([2,3]),因?yàn)?,3對(duì)應(yīng)的boolean值為True。之后再sum就實(shí)現(xiàn)了和循環(huán)一樣的功能。

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容