提问者:小点点

numpy数组dtype在Windows 10 64位机器中默认为int32


我在笔记本电脑上安装了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?

感谢任何帮助。


共3个答案

匿名用户

默认整数类型np。int_是C长:

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平台的一种怪异。

匿名用户

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

匿名用户

最初的发帖人Prana问了一个非常好的问题。“为什么在64位机器上,整数默认设置为32位?”

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

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

如果您正在进行整数数学,则在任何解释器中使用32位整数作为默认整数可能会导致非常奇怪的结果,正如这个问题所指出的:

使用numpy对平方值给出负数

现在看来,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

d type('in t 64')

>>> print t_array ** 2

[ 1 4 2289813904]

但是如果我们将t_array一个32位整数,则会得到以下结果,因为整数计算会滚动到32位字中的符号位。

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

d type*('in t 32')

>>> print t_array32 ** 2

[ 1 4 -2005153392]

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