Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
numpy初学者数组普通python与numpy向量:错误结果_Python_Vector_Numpy - Fatal编程技术网

numpy初学者数组普通python与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

我对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
        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位无关。它可以在任何一种情况下正常工作:Python
int
s可以是任意大小。[背景中有一些实现细节,涉及到它是调用
int
还是
long
,但您不必担心,转换是无缝的。这就是为什么有时您会在数字末尾看到
L
。]

例如:

>>> 2**100
1267650600228229401496703205376L
另一方面,
numpy
integer
dtypes
是固定精度的,对于足够大的数字,无论其宽度有多大,都会失败:

>>> 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位无关。它可以在任何一种情况下正常工作:Python
int
s可以是任意大小。[背景中有一些实现细节,涉及到它是调用
int
还是
long
,但您不必担心,转换是无缝的。这就是为什么有时您会在数字末尾看到
L
。]

例如:

>>> 2**100
1267650600228229401496703205376L
另一方面,
numpy
integer
dtypes
是固定精度的,对于足够大的数字,无论其宽度有多大,都会失败:

>>> 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。你可以