在 Windows 10 64 位机器上,默认情况下,numpy 数组的数据类型为 int32。

33

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

感谢任何帮助。


可能需要检查一下[SO]: _csv.Error: field larger than field limit (131072) (@CristiFati's answer),虽然情况不同,但是原因相同。 - CristiFati
5个回答

26

16

在Linux上,int的大小也是32位。 - Severin Pappadeux
1
@SeverinPappadeux 谢谢,我应该更明确地说明默认的numpy整数所使用的C数据类型。我已经更新了我的答案。在64位Linux系统上,long int是64位。 - Warren Weckesser
那么不使用np.int64的原因是什么呢? - endolith

8

原帖作者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位整数作为默认整数可能会导致非常奇怪的结果,如果您正在进行整数运算,则会指出这个问题:

使用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

dtype('int64')

>>> print t_array ** 2

[1 4 -2005153392]

如果我们将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位浮点数相比,速度提升可能会非常显著。


7
NumPy在64位Linux和OSX上默认使用64位整数,问题只出现在Windows操作系统上。 :) - user7138814
感谢@gemesyscanada。我的Python和Numpy版本分别为3.7.3和1.16.5。我仍然遇到相同的问题。有任何建议或评论来解决这个问题吗? - Erkan Hatipoglu

1

您可以创建数据类型设置为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)

1
您可以将数组显式地转换为所需的数据类型,方法如下:
int64_array = int32_array.astype(np.int64)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接