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

Posted

技术标签:

【中文标题】numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32【英文标题】:numpy array dtype is coming as int32 by default in a windows 10 64 bit machine 【发布时间】:2016-07-16 16:06:57 【问题描述】:

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

感谢任何帮助。

【问题讨论】:

【参考方案1】:

默认整数类型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

这有点奇怪。

【讨论】:

【参考方案2】:

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

【讨论】:

int 在 Linux 上的大小也是 32 位 @SeverinPappadeux 谢谢——我应该更明确地说明用作默认 numpy 整数的 C 数据类型。我已经更新了我的答案。在 64 位 Linux 系统上,long int 是 64 位。 那有什么理由不使用 np.int64 吗?【参考方案3】:

原始海报 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 位浮点数相比,速度增益可能相当大意义重大。

【讨论】:

Numpy 在 64 位 Linux 和 OSX 上默认总是使用 64 位整数,问题只有 Windows :) 谢谢,@gemesyscanada。我的 Python 和 Numpy 版本分别是 3.7.3 和 1.16.5。我仍然遇到同样的问题。有什么建议或方法来解决这个问题吗?【参考方案4】:

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

int64_array = int32_array.astype(np.int64)

【讨论】:

【参考方案5】:

您可以创建数据类型设置为 int64 的数组。例如,

#Windows uses int32 by default, but if we want int64, we can tell it to
x = np.array([1, 2, 3, 4, 5], dtype=np.int64)

【讨论】:

以上是关于numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32的主要内容,如果未能解决你的问题,请参考以下文章

转换具有 numpy 数组的列将其转换为 dtype 作为对象的 numpy 数组

在 dtype obj 的 NumPy 数组中查找缺失值

如何转换numpy子数组的dtype?

无法设置从 Numpy 数组读取的适当 dtype

如何在我的 numpy 数组中找到 NaN/infinity/对于 dtype('float64') 来说太大的值?

我可以在生成随机值时指定一个 numpy dtype 吗?