numpy初学者数组普通python与numpy向量:错误结果
我对NumPy完全陌生,并尝试了教科书上的代码。不幸的是,在一定的计算规模下,NumPy结果会被搞砸。代码如下:numpy初学者数组普通python与numpy向量:错误结果,python,vector,numpy,Python,Vector,Numpy,我对NumPy完全陌生,并尝试了教科书上的代码。不幸的是,在一定的计算规模下,NumPy结果会被搞砸。代码如下: import sys from datetime import datetime import numpy def pythonsum(n): a = range(n) b = range(n) c = [] for i in range(len(a)): a[i] = i**2 b[i] = i**3
import sys
from datetime import datetime
import numpy
def pythonsum(n):
a = range(n)
b = range(n)
c = []
for i in range(len(a)):
a[i] = i**2
b[i] = i**3
c.append(a[i]+b[i])
return c
def numpysum(n):
a = numpy.arange(n) ** 2
b = numpy.arange(n) ** 3
c = a + b
return c
size = int(sys.argv[1])
start = datetime.now()
c=pythonsum(size)
delta = datetime.now()-start
print "The last 2 elements of the sum",c[-2:]
print "PythonSum elapsed time in microseconds", delta.microseconds
start = datetime.now()
c=numpysum(size)
delta = datetime.now()-start
print "The last 2 elements of the sum",c[-2:]
print "NumPySum elapsed time in microseconds", delta.microseconds
当大小>=1291时,结果为负值
我正在使用python 2.6、MacOSX 10.6和NumPy 1.5.0
有什么想法吗?从Numpy 1.5开始
“操作时间-添加向量”中的介绍性示例将仅在允许长整数的64位平台上运行。否则将返回错误的结果:
The last 2 elements of the sum [-2143491644 -2143487647]
要解决此问题,请将幂函数中的整数转换为浮点值,以便转发浮点值。
结果:速度提高了10倍
$python vectorsum.py 1000000
总和的最后两个元素[9.99995000008e+17,9.9999800001E+17]
PythonSum运行时间(微秒)3 59013
总和的最后两个元素[9.9999999e+17 9.999999e+17]
NumPySum运行时间(微秒)0 308598
更正的示例:
导入系统
从日期时间导入日期时间
进口numpy
def numpysum(n):
def pythonsum(n):
a=范围(n)
size=int(sys.argv[1])
start=datetime.now()
c=蟒蛇(大小)
delta=datetime.now()-start
打印“总和的最后两个元素”,c[-2:]
打印“PythonSum运行时间(微秒)”,增量秒,
增量微秒
start=datetime.now()
c=numpysum(尺寸)
delta=datetime.now()-start
打印“总和的最后两个元素”,c[-2:]
打印“以微秒为单位的NumPySum运行时间”,增量秒,增量微秒
代码在这里的pastebin中提供从Numpy 1.5开始
“操作时间-添加向量”中的介绍性示例将仅在允许长整数的64位平台上运行。否则将返回错误的结果:
The last 2 elements of the sum [-2143491644 -2143487647]
要解决此问题,请将幂函数中的整数转换为浮点值,以便转发浮点值。
结果:速度提高了10倍
$python vectorsum.py 1000000
总和的最后两个元素[9.99995000008e+17,9.9999800001E+17]
PythonSum运行时间(微秒)3 59013
总和的最后两个元素[9.9999999e+17 9.999999e+17]
NumPySum运行时间(微秒)0 308598
更正的示例:
导入系统
从日期时间导入日期时间
进口numpy
def numpysum(n):
def pythonsum(n):
a=范围(n)
size=int(sys.argv[1])
start=datetime.now()
c=蟒蛇(大小)
delta=datetime.now()-start
打印“总和的最后两个元素”,c[-2:]
打印“PythonSum运行时间(微秒)”,增量秒,
增量微秒
start=datetime.now()
c=numpysum(尺寸)
delta=datetime.now()-start
打印“总和的最后两个元素”,c[-2:]
打印“以微秒为单位的NumPySum运行时间”,增量秒,增量微秒
代码可以在这里的pastebin中找到我认为这个线程有一些混乱。纯Python,即非
numpy
,代码工作的原因与32位与64位无关。它可以在任何一种情况下正常工作:Pythonint
s可以是任意大小。[背景中有一些实现细节,涉及到它是调用int
还是long
,但您不必担心,转换是无缝的。这就是为什么有时您会在数字末尾看到L
。]
例如:
>>> 2**100
1267650600228229401496703205376L
另一方面,numpy
integerdtypes
是固定精度的,对于足够大的数字,无论其宽度有多大,都会失败:
>>> for kind in numpy.int8, numpy.int16, numpy.int32, numpy.int64:
... for power in 1, 2, 5, 20:
... print kind, power, kind(10), kind(10)**power
...
<type 'numpy.int8'> 1 10 10
<type 'numpy.int8'> 2 10 100
<type 'numpy.int8'> 5 10 100000
<type 'numpy.int8'> 20 10 -2147483648
<type 'numpy.int16'> 1 10 10
<type 'numpy.int16'> 2 10 100
<type 'numpy.int16'> 5 10 100000
<type 'numpy.int16'> 20 10 -2147483648
<type 'numpy.int32'> 1 10 10
<type 'numpy.int32'> 2 10 100
<type 'numpy.int32'> 5 10 100000
<type 'numpy.int32'> 20 10 1661992960
<type 'numpy.int64'> 1 10 10
<type 'numpy.int64'> 2 10 100
<type 'numpy.int64'> 5 10 100000
<type 'numpy.int64'> 20 10 7766279631452241920
我认为这条线索有些混乱。纯Python,即非
numpy
,代码工作的原因与32位与64位无关。它可以在任何一种情况下正常工作:Pythonint
s可以是任意大小。[背景中有一些实现细节,涉及到它是调用int
还是long
,但您不必担心,转换是无缝的。这就是为什么有时您会在数字末尾看到L
。]
例如:
>>> 2**100
1267650600228229401496703205376L
另一方面,numpy
integerdtypes
是固定精度的,对于足够大的数字,无论其宽度有多大,都会失败:
>>> for kind in numpy.int8, numpy.int16, numpy.int32, numpy.int64:
... for power in 1, 2, 5, 20:
... print kind, power, kind(10), kind(10)**power
...
<type 'numpy.int8'> 1 10 10
<type 'numpy.int8'> 2 10 100
<type 'numpy.int8'> 5 10 100000
<type 'numpy.int8'> 20 10 -2147483648
<type 'numpy.int16'> 1 10 10
<type 'numpy.int16'> 2 10 100
<type 'numpy.int16'> 5 10 100000
<type 'numpy.int16'> 20 10 -2147483648
<type 'numpy.int32'> 1 10 10
<type 'numpy.int32'> 2 10 100
<type 'numpy.int32'> 5 10 100000
<type 'numpy.int32'> 20 10 1661992960
<type 'numpy.int64'> 1 10 10
<type 'numpy.int64'> 2 10 100
<type 'numpy.int64'> 5 10 100000
<type 'numpy.int64'> 20 10 7766279631452241920
嗨-尝试在你的数学计算中加入float(),这样i2就变成了float(i2)numpy。arange(n)**2就是问题所在。python代码很好。因为numpy.arange()创建了一个向量,所以我不能在它周围使用float()。因为我已经找到了。。。。a=numpy.arange(n,dtype=numpy.uint64)完成了这个任务。导致错误结果的是32位整数。但是:为什么这在NumPy中是一个问题,而在本机Python 2.6中不是?为什么:这是一个64位对32位的平台问题。最大的32位整数是231,其中最大的64位整数是263。你现在可以在下面的答案上打勾:-)嗨-试着在你的数学计算中加入float(),这样i2就变成了float(i2)numpy。arange(n)**2就是问题所在。python代码很好。因为numpy.arange()创建了一个向量,所以我不能在它周围使用float()。因为我已经找到了。。。。a=numpy.arange(n,dtype=numpy.uint64)完成了这个任务。导致错误结果的是32位整数。但是:为什么这在NumPy中是一个问题,而在本机Python 2.6中不是?为什么:这是一个64位对32位的平台问题。最大的32位整数是231,其中最大的64位整数是263。你可以