默认情况下,numpy数组dtype在Windows 10 64位机器中以int32形式出现

Pra*_*ana 15 python numpy spyder anaconda

我在笔记本电脑上安装了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
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)

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

任何帮助表示赞赏.

Sto*_*ica 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平台的一种奇怪之处.


War*_*ser 7

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


小智 6

原始海报,普拉纳,问了一个很好的问题。“为什么整数默认设置为 32 位,在 64 位机器上?”

据我所知,简短的回答是:“因为它被设计错了”。似乎很明显,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 位整数作为默认整数可能会导致非常奇怪的结果,正如这个问题所指出的:

使用 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
Run Code Online (Sandbox Code Playgroud)

dtype('int64')

>>> print t_array ** 2
Run Code Online (Sandbox Code Playgroud)

[ 1 4 2289813904]

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

>>> t_array32 = np.asarray(tlist, dtype=np.int32)
>>> t_array32.dtype
Run Code Online (Sandbox Code Playgroud)

dtype*('int32')

>>> print t_array32 ** 2
Run Code Online (Sandbox Code Playgroud)

[ 1 4 -2005153392]

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

  • Numpy 在 64 位 Linux 和 OSX 上默认总是使用 64 位整数,问题仅在于 Windows `:)` (2认同)