我在笔记本电脑上安装了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?
感谢任何帮助。
答案 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)