在Windows x64上将numpy.int64数据类型解释为Python中的本机int数据类型

时间:2019-09-05 10:14:43

标签: python python-3.x pandas numpy

背景

我在机器学习案例中执行代码时遇到问题。我已经通过一个丑陋的解决方法解决了该问题,因此我能够执行笔记本,但是我仍然不完全了解问题的原因。

当我尝试执行以下代码(使用sklearn的 OneHotEncoder 创建虚拟变量)时,就会出现问题。

categorical_columns = ~np.in1d(train_X.dtypes, [int, float])

尽管代码执行没有任何错误,但是它无法将numpy.int64识别为int数据类型,因此将所有int64数据类型列归为分类,并将其解析为OneHotEncoder。

train_X是具有以下列和数据类型的pandas数据框对象,如您所见,整数存储为numpy.int64。

dataframe

该代码最初是在Mac上的Jupyter Notebook中编写的,可以正常工作,并且在Google云上的Colaboraty中也可以正常运行。所有其他尝试在几乎相同的Windows计算机上从Jupyter运行代码的人都遇到了与运行脚本时相同的问题。

问题:

在Windows计算机上,似乎numpy.int64没有链接到本机int数据类型。

我尝试并验证过的内容

  1. 尽管已过时并且基于python 2.7.x,但这个post使我相信这是一个版本问题,因此我验证了:
    • 我的机器在Windows 10的64位版本上运行
    • Python安装为64位
    • Anaconda也安装为64位
    • 使用了只有熊猫,numpy,sklearn和依赖项的干净环境,所有这些都已更新到最新版本
    • 运行python时,我得到以下信息:

terminal

我在这里注意到了一个奇怪的“ on win32”,但根据post 1post 2

来看,它似乎仅仅是“微软的无限智慧”的产物。
  1. 我尝试通过阅读123来理解问题。我已经设法基于这些计算出了几种解决方法,但是我仍然不明白为什么代码可以在一个系统上运行而不能在另一个系统上运行。

问题:

为什么在Windows上所有内容都运行64位时numpy.int64不能转换为本地int数据类型,而在Mac和其他系统上却如此?

1 个答案:

答案 0 :(得分:2)

对于Windows 64上默认的int为什么是int32的原因,我没有任何答案,但这是一个非常令人困惑的事实:

np.dtype('int')在64位Windows上返回dtype('int32'),在64位Linux上返回dtype('int64')

另请参阅the second warning here和此numpy github issue

在您的具体情况下,我将使用pandas的is_numeric_dtype函数来以独立于平台的简单方式检查数值:

from pandas.api.types import is_numeric_dtype
categorical_columns = ~train_X.dtypes.apply(is_numeric_dtype).to_numpy()