python编程学习np.float 被删除的问题解析
作者:YunfengWang 发布时间:2021-10-26 23:43:17
1. 概述
在Numpy 1.24版本中,删除了像np.float
、np.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.float64
或np.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.int | int | np.int32/np.int64 |
np.float | float | np.float32/np.float64 |
np.bool | bool | np.bool_ |
np.complex | complex | np.complex128 |
np.object | object | - |
np.str | str | np.str_ |
np.long | int | np.int32/np.int64 |
np.unicode | str | np.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.int
和np.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万行代码,我自己短期内就在两个仓库中遇到这个问题。好在解决办法也比较直接,希望可以顺利的过渡过去。
来源:https://juejin.cn/post/7196439418877001783
猜你喜欢
- 本文实例讲述了Django利用cookie保存用户登录信息的方法。分享给大家供大家参考,具体如下:设置cookieresponse对象.se
- 条件1、能够上网2、必须是你的好友3、必须能二维码登录网页微信发送示例# 使用微信接口给微信好友发送消息,import itchat&nbs
- 列表生成式可以使用列表生成式生成 列表元素。例如:列表还支持 if … else 与 for 循环组合的单行表达式进行
- 因为这两天在学习深度学习需要用到ubuntu+python3.6版本,所以就按照网上的教学安装,但是ubuntu16.04自带的是pytho
- 1、实现的效果示例代码:df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2
- 同事在准备新老系统的切换,清空一个表的时候往往发现这个表的主键被另一个表用做外键,而系统里有太多层次的引用.所以清起来相当麻烦用下面这个脚本
- 1.方法方法描述bbox(item, column=None)返回指定item的框选范围,或者单元格的框选范围column( cid, op
- Python常用的数据结构,有如下几种。但是我们用的最多的,还是字符串、列表、字典这3种。其实学习任何一门编程语言,最基础的就是学习它的数据
- 如何获取指定元素在想要获取元素上添加“ref” ref="scroll&quo
- 本文实例为大家分享了python简单贪吃蛇的具体代码,供大家参考,具体内容如下import sysimport randomimport p
- 0x 00 返回值简介回顾下,上一节简单介绍了函数及其各种参数,其中也有简单介绍 print 和 return 的区别,print 仅仅是打
- 如果我有个list,想判断其中的元素是否满一个条件,后面的元素大于或等于前面元素。Python中的写法就比较多了。下面就主要介绍下一般的写法
- '================================================ '
- 本文实例讲述了JS实现选择TextArea内文本的方法。分享给大家供大家参考。具体实现方法如下:<script type="
- 在程序的开发过程中,处理分页是大家接触比较频繁的事件,因为现在软件基本上都是与数据库进行挂钩的。但效率又是我们所追求的,如果是像原来那样把所
- 1.集合的定义集合的元素是不可重复的s = {1,2,3,1,2,3,4,5}print(s)print(type(s))s1 = {1}p
- 1、正则表达式包括两部分①定义正则表达式的规则;②正则表达式的模式(i/g/m);2、声明正则表达式① 字面量声明: var reg = /
- 今天,跟大家聊聊gin框架中是如何实现分片输出的。主要分以下4点:分片输出的效果图gin实现分片传输代码http分片传输的基础:transf
- 合理地扩大页面链接响应区域可以提高网页的易用性。同时还要兼顾到链接的交互一致性以及视觉上的平衡,就需要做一些特殊的处理。实例一:一张图配一个
- 关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击“属性”,选择“选项”并点击。将其中的排序规则设置