第
python编程学习np.float被删除的问题解析
目录1.概述2.代码验证3.Why4.带来的影响
1.概述
在Numpy1.24版本中,删除了像np.float、这样的Python内置类型的alias,因此以后在代码中使用这些类型会报错AttributeError:modulenumpyhasnoattributefloat,涉及的类型包括:
numpy.bool
numpy.float
plex
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替换类型32/64np.floatfloatnp.float32/np.float64np.boolboolnp.bool_plex128np.objectobject-np.strstrnp.str_32/64np.unicodestrnp.str_
详细说明参考NumPy1.20.0ReleaseNotes。
下面详细说说事情的来龙去脉。
2.代码验证
下面我搭建Numpy1.20.0和1.24.0的环境进行简单测试,以及分析为什么会弃用这些类型。
首先是Numpy1.20.0环境搭建与简单测试:
python-mvenvnp1.20
sourcenp1.20/bin/activate
pipinstallnumpy==1.20
python-cimportnumpyasnp;a=np.array([1.0],dtype=np.float)
输出如下:
string:1:DeprecationWarning:`np.float`isadeprecatedaliasforthebuiltin`float`.Tosilencethiswarning,use`float`byitself.Doingthiswillnotmodifyanybehaviorandissafe.Ifyouspecificallywantedthenumpyscalartype,use`np.float64`here.
DeprecatedinNumPy1.20;formoredetailsandguidance:/devdocs/release/1.20.0-notes.html#deprecations
仔细看这段输出的话,可以发现从Numpy1.20版本开始,Numpy已经弃用np.float类型了,并且给出了替换建议,以及详细的说明文档地址。
而在Numpy1.24版本里面,正式删除了np.float,可以用下面的代码来测试。首先我们创建一个新的环境,安装Numpy1.24版本,然后创建一个np.float类型的数组:
python-mvenvnp1.24
sourcenp1.24/bin/activate
pipinstallnumpy==1.24
python-cimportnumpyasnp;a=np.array([1.0],dtype=np.float)
输出如下:
Traceback(mostrecentcalllast):
Filestring,line1