python编程学习np.float 被删除的问题解析

 更新时间:2023年02月06日 09:15:07   作者:YunfengWang  
这篇文章主要为大家介绍了python编程学习np.float 被删除的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1. 概述

在Numpy 1.24版本中,删除了像np.floatnp.int 这样的 Python 内置类型的 alias,因此以后在代码中使用这些类型会报错AttributeError: module 'numpy' has no attribute 'float', 涉及的类型包括:

numpy.bool

numpy.int

numpy.float

numpy.complex

numpy.object

numpy.str

numpy.long

numpy.unicode

那该怎么解决这个错误呢?

TL;DR

  • 对于在标量上的操作,直接使用Python内置类型替换
foo = np.random.rand(10)
# 原先用法,注意foo[0]是一个标量
bar = np.float(foo[0])
# 新用法
bar = float(foo[0])
  • 对于在np.ndarray 上的操作,使用np.float64np.float32 来替代,具体选择哪个需要自己根据情况来确定,不同类型精度会有不同,下面举两个例子:
# 原先用法
foo = np.random.rand(10, dtype=np.float)
# 新用法
foo = np.random.rand(10, dtype=np.float32)
# 原先用法
foo = np.random.rand(10).astype(np.float)
# 新用法
foo = np.random.rand(10).astype(np.float32)

这里列出来了删除类型在标量和np.ndarray 上的替代,方便查找

原先类型标量替换类型np.ndarray替换类型
np.intintnp.int32/np.int64
np.floatfloatnp.float32/np.float64
np.boolboolnp.bool_
np.complexcomplexnp.complex128
np.objectobject-
np.strstrnp.str_
np.longintnp.int32/np.int64
np.unicodestrnp.str_

详细说明参考NumPy 1.20.0 Release Notes

下面详细说说事情的来龙去脉。

2. 代码验证

下面我搭建 Numpy 1.20.0 和 1.24.0 的环境进行简单测试,以及分析为什么会弃用这些类型。

首先是 Numpy 1.20.0 环境搭建与简单测试:

python -m venv np1.20
source np1.20/bin/activate
pip install numpy==1.20
python -c "import numpy as np; a = np.array([1.0], dtype=np.float)"

输出如下:

<string>:1: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations

仔细看这段输出的话,可以发现从 Numpy 1.20 版本开始,Numpy已经弃用np.float 类型了,并且给出了替换建议,以及详细的说明文档地址

而在 Numpy 1.24版本里面,正式删除了np.float,可以用下面的代码来测试。 首先我们创建一个新的环境,安装Numpy 1.24版本,然后创建一个np.float类型的数组:

python -m venv np1.24
source np1.24/bin/activate
pip install numpy==1.24
python -c "import numpy as np; a = np.array([1.0], dtype=np.float)"

输出如下:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/name/np1.24/lib/python3.9/site-packages/numpy/__init__.py", line 284, in __getattr__
    raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute 'float'

直接就报了我们开头提到的属性错误。

3. Why

其实早在2015年,Numpy 开发者就在策划删除这些类型了,只不过当时使用范围太广,删除造成的影响太大,所以在近8年,1.20-1.24 4个版本的Warning后,才正式删除。

为什么要删除这些操作呢?我自己觉得是因为np.float 这种类型太容易误用了。大家都以为np.float是一个Numpy的数据类型,是np.float32的alias,但实际它是内置类型,是int类型的alias。 就像下面这个例子:

>>> foo = np.array([10], dtype=np.int32)
>>> bar = np.int(foo)
>>> type(bar)
<class 'int'>
>>> baz = np.int32(foo)
>>> type(baz)
<class 'numpy.ndarray'>

可以看到,对np.ndarray 数组进行np.intnp.int32的操作,一个得到int类型的变量,另一个得到的是np.ndarray类型的变量。

详细的原因可以参考上面的 issue 链接。

那最早为什么还要引入np.float呢?直接用Python内置的类型不好吗?其实这是在很早的Numpy版本中错误地引入的,那个版本np.float的含义就是np.float64 ,只不过后来版本中np.float 的含义修改了,但如果直接删除np.float,有人使用老版本的Numpy,就会在执行from numpy import * 报错。当前那个老版本已经很少有人用了 ,所以就删除了。

4. 带来的影响

这个改动带来的影响可以说是非常大了,简单来说,在 Numpy 1.24.0以上的版本中,使用np.float的代码都会直接报错。而 Numpy 作为 Python 在科学计算中的基础包,被广泛使用的程度无需我赘述。

简单在GitHub 搜索了一下,光涉及到np.float的(结果1结果2)就有近9万行代码,我自己短期内就在两个仓库中遇到这个问题。好在解决办法也比较直接,希望可以顺利的过渡过去。

以上就是python编程学习np.float 被删除的问题解析的详细内容,更多关于python np.float 被删除的资料请关注脚本之家其它相关文章!

相关文章

  • 12步入门Python中的decorator装饰器使用方法

    12步入门Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里我们由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下
    2016-06-06
  • Python实现ElGamal加密算法的示例代码

    Python实现ElGamal加密算法的示例代码

    ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。这篇文章通过示例代码给大家介绍Python实现ElGamal加密算法的相关知识,感兴趣的朋友一起看看吧
    2020-06-06
  • python随机数分布random均匀分布实例

    python随机数分布random均匀分布实例

    今天小编就为大家分享一篇python随机数分布random均匀分布实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Django 迁移、操作数据库的方法

    Django 迁移、操作数据库的方法

    这篇文章主要介绍了Django 迁移、操作数据库的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python for 循环语句的使用

    Python for 循环语句的使用

    这篇文章主要介绍了Python for 循环语句,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • python 重命名轴索引的方法

    python 重命名轴索引的方法

    今天小编就为大家分享一篇python 重命名轴索引的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python函数参数中的*与**运算符

    Python函数参数中的*与**运算符

    这篇文章主要介绍了Python函数参数中的*与**运算符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 深入解析Python中函数的参数与作用域

    深入解析Python中函数的参数与作用域

    这篇文章主要介绍了Python中函数的参数与作用域,是Python入门学习中的基础知识,需要的朋友可以参考下
    2016-03-03
  • Flask实现定制日志并输出到文件

    Flask实现定制日志并输出到文件

    这篇文章主要为大家学习介绍了Flask如何实现定制日志并输出到文件,文中的示例代码简介易懂,感兴趣的小伙伴快跟随小编一起学习一下吧
    2023-07-07
  • Python实现破解猜数游戏算法示例

    Python实现破解猜数游戏算法示例

    这篇文章主要介绍了Python实现破解猜数游戏算法,简单描述了猜数游戏的原理,并结合具体实例形式分析了Python破解猜数游戏的相关实现技巧,需要的朋友可以参考下
    2017-09-09

最新评论