python編程學習np.float 被刪除的問題解析
1. 概述
在Numpy 1.24版本中,刪除了像np.float
、np.int
這樣的 Python 內(nèi)置類型的 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內(nèi)置類型替換
foo = np.random.rand(10) # 原先用法,注意foo[0]是一個標量 bar = np.float(foo[0]) # 新用法 bar = float(foo[0])
- 對于在
np.ndarray
上的操作,使用np.float64
或np.float32
來替代,具體選擇哪個需要自己根據(jù)情況來確定,不同類型精度會有不同,下面舉兩個例子:
# 原先用法 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 的環(huán)境進行簡單測試,以及分析為什么會棄用這些類型。
首先是 Numpy 1.20.0 環(huán)境搭建與簡單測試:
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
仔細看這段輸出的話,可以發(fā)現(xiàn)從 Numpy 1.20 版本開始,Numpy已經(jīng)棄用np.float
類型了,并且給出了替換建議,以及詳細的說明文檔地址。
而在 Numpy 1.24版本里面,正式刪除了np.float
,可以用下面的代碼來測試。 首先我們創(chuàng)建一個新的環(huán)境,安裝Numpy 1.24版本,然后創(chuàng)建一個np.float
類型的數(shù)組:
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 開發(fā)者就在策劃刪除這些類型了,只不過當時使用范圍太廣,刪除造成的影響太大,所以在近8年,1.20-1.24 4個版本的Warning后,才正式刪除。
為什么要刪除這些操作呢?我自己覺得是因為np.float
這種類型太容易誤用了。大家都以為np.float
是一個Numpy的數(shù)據(jù)類型,是np.float32
的alias,但實際它是內(nèi)置類型,是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
數(shù)組進行np.int
和np.int32
的操作,一個得到int
類型的變量,另一個得到的是np.ndarray
類型的變量。
詳細的原因可以參考上面的 issue 鏈接。
那最早為什么還要引入np.float
呢?直接用Python內(nèi)置的類型不好嗎?其實這是在很早的Numpy版本中錯誤地引入的,那個版本np.float
的含義就是np.float64
,只不過后來版本中np.float
的含義修改了,但如果直接刪除np.float
,有人使用老版本的Numpy,就會在執(zhí)行from numpy import *
報錯。當前那個老版本已經(jīng)很少有人用了 ,所以就刪除了。
4. 帶來的影響
這個改動帶來的影響可以說是非常大了,簡單來說,在 Numpy 1.24.0以上的版本中,使用np.float
的代碼都會直接報錯。而 Numpy 作為 Python 在科學計算中的基礎包,被廣泛使用的程度無需我贅述。
簡單在GitHub 搜索了一下,光涉及到np.float
的(結果1, 結果2)就有近9萬行代碼,我自己短期內(nèi)就在兩個倉庫中遇到這個問題。好在解決辦法也比較直接,希望可以順利的過渡過去。
以上就是python編程學習np.float 被刪除的問題解析的詳細內(nèi)容,更多關于python np.float 被刪除的資料請關注腳本之家其它相關文章!
相關文章
python 使用Yolact訓練自己的數(shù)據(jù)集
這篇文章主要介紹了python 使用Yolact訓練自己的數(shù)據(jù)集,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下2021-04-04Python實現(xiàn)根據(jù)指定端口探測服務器/模塊部署的方法
這篇文章主要介紹了Python根據(jù)指定端口探測服務器/模塊部署的方法,非常具有實用價值,需要的朋友可以參考下2014-08-08python抓取某汽車網(wǎng)數(shù)據(jù)解析html存入excel示例
python抓取某汽車網(wǎng)經(jīng)銷商信息網(wǎng)頁數(shù)據(jù)解析html,這里提供一個示例演示,大家可以根據(jù)需要分析自己網(wǎng)站的數(shù)據(jù)2013-12-12python-docx把dataframe表格添加到word文件中
用Python-docx庫,可以輕松地添加表格到Word文檔中,本文主要介紹了python-docx把dataframe表格添加到word文件中,感興趣的可以了解一下2023-08-08