【问题标题】:Interpreting numpy.int64 datatype as native int datatype in Python on windows x64在 Windows x64 上的 Python 中将 numpy.int64 数据类型解释为本机 int 数据类型
【发布时间】:2019-09-05 10:14:43
【问题描述】:

背景:

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

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

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

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

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

代码最初是在 Mac 上的 Jupyter Notebook 中编写的,它运行良好,并且在 Google 云上的 Colaboraty 中也运行良好。所有其他尝试在几乎相同的 Windows 机器上运行 Jupyter 代码的人都遇到了与我在运行脚本时相同的问题。

问题:

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

我已经尝试和验证的事情

  1. 虽然这个post 已经过时并且基于python 2.7.x,但让我相信这是一个版本问题,所以我验证了:
    • 我的机器在 64 位版本的 windows 10 上运行
    • Python 安装为 64 位
    • Anaconda 也安装为 64 位
    • 使用干净的环境,仅包含 pandas、numpy、sklearn 和依赖项,均已更新到最新版本
    • 当我运行 python 时,我得到以下信息:

我注意到这里奇怪的“on win32”,但根据post 1post 2,它似乎只是“微软无限智慧”的产物

  1. 我尝试通过阅读123 来理解这个问题。我已经设法根据这些计算出几种解决方法,但我仍然不明白为什么代码可以在一个系统上运行,而不能在另一个系统上运行。

问题:

为什么 numpy.int64 不能在 Windows 上转换为本机 int 数据类型,而一切都运行 64 位,而在 Mac 和其他系统上却是这样?

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    我不知道为什么 Windows 64 上的默认 intint32,但这是一个非常令人困惑的事实:

    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()
    

    【讨论】:

    • numpy 中的默认整数与 C 中的 long 类型 see docs 密切相关。 C 标准并没有准确地指定 long 的大小,只是它至少是 32 位 (wikipedia link)。实际大小取决于编译器和 cpu 体系结构......其中 Windows x64 / MS Visual C++ 编译器有点独特,因为它不会使 long 大小为 64 位。
    • @user7138814:感谢您的评论。你知道 Windows 64 上的 Inter C++ 编译器处理 long 的方式是否不同吗?
    • 这里奇怪的是long64 确实转换为原生long 以及long32int32 也可以很好地转换为 int
    • @Stef 感谢您的建议!它在导入函数后工作,因为默认情况下它不是用 pandas 导入的import pandas.api.types as ptypes(感谢post
    • 是的,抱歉 - 忘记指出导入,将其添加到答案中
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 2013-02-25
    • 2012-02-22
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多