我想做一个列表的乘法项。 我是通过numpy和python循环完成的,结果是不同的。
您能告诉我什么问题吗?
Numpy代码
import numpy as np
a= [5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5]
print (np.prod(a))
>> 2039787520
不带numpy的python代码
a= [5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5]
k=1
for i in a:
k*=i
print (k)
>> 23514624000
另一种情况:
Numpy代码
a= [4, 7, 6, 5, 4, 5, 6, 8, 2, 8, 4, 8, 9]
import numpy as np
print (np.prod(a))
>> -579076096
没有numpy
a= [4, 7, 6, 5, 4, 5, 6, 8, 2, 8, 4, 8, 9]
k=1
for i in a:
k*=i
print (k)
>> 3715891200
问题:为什么在第二种情况下结果为负且不同?
答案 0 :(得分:1)
Python int是任意精度的。 NumPy dtypes不是; NumPy中的默认整数dtype对应于C long,在您的平台上为32位。要求数字对于C长的时间太大的计算将溢出。
您可以指定一个较大的dtype来存储较大的数字,但是不能存储任意大的数字。
没有溢出:
from turtle import forward as f, back as b, right as r, left as l, exitonclick
# to draw one square
f(100)
r(90)
f(100)
r(90)
f(100)
r(90)
f(100)
exitonclick()
仍然溢出:
In [2]: numpy.prod([5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5], dtype='int64')
Out[2]: 23514624000