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 数组