默认情况下,numpy数组dtype在Windows 10 64位计算机

时间:2016-03-29 07:58:46

标签: python numpy anaconda spyder

我在笔记本电脑上安装了Anaconda 3 64位,并在Spyder中编写了以下代码:

import numpy.distutils.system_info as sysinfo
import numpy as np
import platform

sysinfo.platform_bits 
platform.architecture()

my_array = np.array([0,1,2,3])
my_array.dtype

这些命令的输出显示以下内容:

sysinfo.platform_bits 
Out[31]: 64

platform.architecture()
Out[32]: ('64bit', 'WindowsPE')

my_array = np.array([0,1,2,3])
my_array.dtype
Out[33]: dtype('int32')

我的问题是,即使我的系统是64位,为什么默认情况下数组类型是int32而不是int64?

感谢任何帮助。

4 个答案:

答案 0 :(得分:12)

默认整数类型np.int_是C long:

http://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html

但是C long在win64中是int32。

https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx

这是win64平台的一种奇怪。

答案 1 :(得分:7)

在Microsoft C中,即使在64位系统上,long int数据类型的大小也是32位。 (例如,参见https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx。)Numpy继承了C编译器long int中整数的默认大小。

答案 2 :(得分:2)

原创海报Prana提出了一个非常好的问题。 “为什么在64位计算机上将整数默认值设置为32位?”

尽我所知,简短的回答是:“因为设计错了”。 很明显,64位机器应该默认 - 在任何关联的解释器中将整数定义为64位。但当然,这两个答案解释了为什么情况并非如此。现在情况有所不同,所以我提供了这个更新。

我注意到,对于CentOS-7.4 Linux和MacOS 10.10.5(新旧),运行Python 2.7.14(使用Numpy 1.14.0),(截至2018年1月),默认整数现在定义为64位。 (初始示例中的“my_array.dtype”现在将在两个平台上报告“dtype('int64')”。

如果你正在进行整数数学运算,那么在任何解释器中使用32位整数作为默认整数会产生非常松散的结果,正如这个问题指出的那样:

Using numpy to square value gives negative number

现在看来Python和Numpy已经更新和修改(更正,有人可能会争辩),因此为了复制遇到的问题,如上面的问题所述,你必须明确地将Numpy数组定义为int32。

在Python中,现在在两个平台上,默认整数看起来都是int64。此代码在两个平台(CentOS-7.4和MacOSX 10.10.5)上运行相同:

>>> import numpy as np
>>> tlist = [1, 2, 47852]
>>> t_array = np.asarray(tlist)
>>> t_array.dtype

dtype('int64')

>>> print t_array ** 2

[ 1 4 2289813904]

但是如果我们使t_array成为一个32位整数,那么就得到以下结果,因为整数计算在32位字的符号位上滚动。

>>> t_array32 = np.asarray(tlist, dtype=np.int32)
>>> t_array32.dtype

dtype*('int32')

>>> print t_array32 ** 2

[ 1 4 -2005153392]

使用int32的原因当然是效率。在某些情况下(例如使用TensorFlow或其他神经网络机器学习工具),你想要使用32位表示(当然主要是浮点数),因为速度增加与使用64位浮点数相比,可能相当显著。

答案 3 :(得分:0)

entelkedi,您可以将数组显式转换为所需的数据类型,如下所示:

int64_array = int32_array.astype(np.int64)