numpy.sum没有返回预期值

时间:2017-06-25 04:01:02

标签: python numpy sum primes

我正在解决项目的问题。

'找出低于200万的所有素数的总和'

我已经建立了一个我认为非常快的优质检查器 - 任何有关如何改进的建议都会很棒。

但是,我花了最后30分钟的工作是np.sum没有返回正确的值。这是我的代码:

import numpy as np
def isprime(num, primelist):
    #Give primelist it's first value if none exist
    if len(primelist) == 0:
        primelist.append(num)
        return True
    for primes in primelist:
        #Only need to iterate up to square root of num to test primality
        if primes <= math.sqrt(num):
            #If any number is evenly divisble (remainder = 0) the num is not prime
            if num % primes == 0:
                #print('non-prime')
                return False
                break
        #If we have iterated through all primes <= sqrt of num, num is prime
        else:
            primelist.append(num)
            #print('prime')
            return True
            break

lim = 2000000
n = 3
primelist = [2]

while primelist[-1] <= lim:
    isprime(n, primelist)
    n += 1

if primelist[-1] > lim: primelist = primelist[:-1]
primearray = np.asarray(primelist)
print(np.sum(primearray))

sum = 0
for i in primelist:
    sum = sum + i
print(sum)

我想它也可能是np.asarray不起作用而不是np.sum

我已经遍历原始列表来测试返回值numpy。

numpy sum = 1179908154

迭代sum = 142913828922

超过100倍。请问我哪里错了!!

1 个答案:

答案 0 :(得分:1)

我的猜测是你正在使用Windows,其中numpy中的整数的默认大小是32位。 np.sum(primelist)使用32位整数计算总和,并且总和溢出。您可以通过计算(使用Python整数)142913828922 % (2**31)来验证这一点:

In [18]: s = 142913828922

In [19]: s % (2**31)
Out[19]: 1179908154

这是您使用numpy.sum(primelist)获得的价值。

您可以通过显式将primelist转换为64位无符号整数数组,然后计算其总和来避免此问题(或者至少将其推迟到64位整数溢出):

np.array(primelist, dtype=np.uint64).sum()

或者在处理非常大的整数时不要使用numpy。