numpy中的nan和inf,及其批量判別、替換方式
1、概念
nan
:not a number (非數(shù)值)inf
:infinity (inf:正無窮,-inf:負(fù)無窮 ),下文中的 inf 包含了兩種無窮numpy 中,nan 和 inf 的類型都是 float 。
2、性質(zhì)
2-1、多個(gè) nan 之間的比較,地址相等,值不相等
import numpy as np print(f'nan 之間的值比較 {np.nan == np.nan}') print(f'nan 之間的地址比較 {np.nan is np.nan}')
Out[18]: nan 之間的值比較 False nan 之間的地址比較 True
2-2、nan 與任何值的計(jì)算,結(jié)果都是 nan
2-3、多個(gè) inf 之間的比較,地址相等,值相等
print(f'inf 之間的值比較 {np.inf == np.inf}') print(f'inf 之間的地址比較 {np.inf is np.inf}')
Out[19]: inf 之間的值比較 True inf 之間的地址比較 True
2-4、0乘以 inf 結(jié)果是 nan,其他與 inf 做的簡單加、乘運(yùn)算,結(jié)果都是 inf
In[20]: 0 * np.inf Out[20]: nan
In[21]: 2341 * np.inf Out[21]: inf In[22]: -241 + np.inf Out[21]: inf
2-5、inf 外的其他數(shù)除以 inf,結(jié)果是0,inf 除以 inf,結(jié)果是 nan
In[22]: 894 / np.inf Out[22]: 0.0 In[23]: np.inf / np.inf Out[23]: nan
2-6、所有數(shù)都比 -inf 大 所有數(shù)都比 +inf 小,+inf 和 +inf 相等,-inf 和 -inf 相等
In[24]: 1.0e-28 > -np.inf Out[24]: True In[25]: 1.e+43 < np.inf Out[25]: True In[26]: np.inf == np.inf True In[27]: -np.inf == -np.inf Out[27]: True
3、數(shù)組中 nan、inf 的批量判別
np.isnan()
:批量判別數(shù)組中每個(gè)元素是否為 nannp.isinf()
:批量判別數(shù)組中每個(gè)元素是否為 infnp.isneginf()
:批量判別數(shù)組中每個(gè)元素是否為 +infnp.isposinf()
: 批量判別數(shù)組中每個(gè)元素是否為 -infnp.isfinite()
:批量判別數(shù)組中每個(gè)元素是否為非 inf 非 nan 的值
以上的返回值都是與被判別數(shù)組同維度的 bool 值數(shù)組
In[30]: a1 = np.array([[1, np.nan, np.inf], [np.nan, -np.inf, -0.25]]) print(a1) print(np.isfinite(a1)
Out[30]: array([[ 1. , nan, inf], [ nan, -inf, -0.25]]) array([[ True, False, False], [False, False, True]])
4、數(shù)組中 nan、inf 的批量替換
4-1、數(shù)組中 nan、inf 值的批量替換
In[31]: a = np.array([[np.nan, np.nan, 1, 2], [np.inf, np.inf, 3, 4], [1, 1, 1, 1], [2, 2, 2, 2]]) print('替換前') print (a) where_are_nan = np.isnan(a) where_are_inf = np.isinf(a) #nan替換成0,inf替換成nan a[where_are_nan] = 0 a[where_are_inf] = np.nan print('替換后') print(a)
Out[31]: 替換前 [[nan nan 1. 2.] [inf inf 3. 4.] [ 1. 1. 1. 1.] [ 2. 2. 2. 2.]] 替換后 [[ 0. 0. 1. 2.] [nan nan 3. 4.] [ 1. 1. 1. 1.] [ 2. 2. 2. 2.]]
4-2、nan值替換成每列的均值
In[32]: def fill_ndarray(t1): for i in range(t1.shape[1]): # 遍歷每一列(每一列中的nan替換成該列的均值) temp_col = t1[:, i] # 當(dāng)前的一列 nan_num = np.count_nonzero(temp_col != temp_col) if nan_num != 0: # 不為0,說明當(dāng)前這一列中有nan temp_not_nan_col = temp_col[temp_col == temp_col] # 去掉nan的ndarray # 選中當(dāng)前為nan的位置,把值賦值為不為nan的均值 temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean() # mean()表示求均值。 return t1 if __name__ == '__main__': t1 = np.array([[ 0., 1., 2., 3., 4., 5.], [ 6., 7., np.nan, np.nan, np.nan, np.nan], [12., 13., 14., 15., 16., 17.], [18., 19., 20., 21., 22., 23.]]) print('替換前') print(t1) t1 = fill_ndarray(t1) # 將nan替換成對(duì)應(yīng)的均值 print('替換后') print(t1)
Out[32]: 替換前 [[ 0. 1. 2. 3. 4. 5.] [ 6. 7. nan nan nan nan] [12. 13. 14. 15. 16. 17.] [18. 19. 20. 21. 22. 23.]] 替換后 [[ 0. 1. 2. 3. 4. 5.] [ 6. 7. 12. 13. 14. 15.] [12. 13. 14. 15. 16. 17.] [18. 19. 20. 21. 22. 23.]]
替換成行均值的類似處理即可。
4-3、inf替換成每列的均值
先把所有 inf 都換成 nan,之后參照 3-2 處理即可。
4-4、numpy.nan_to_num(x)
使用說明:用 0 代替數(shù)組 x 中的 nan,用有限值代替 inf
In[33]: a = np.array([[np.nan,np.inf], [-np.nan,-np.inf]]) np.nan_to_num(a)
Out[33]: array([[ 0.00000000e+000, 1.79769313e+308], [ 0.00000000e+000, -1.79769313e+308]])
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python上selenium的彈框操作實(shí)現(xiàn)
這篇文章主要介紹了python上selenium的彈框操作實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧總結(jié)
這篇文章主要介紹了Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧,結(jié)合實(shí)例形式總結(jié)分析了Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08python基礎(chǔ)之變量和數(shù)據(jù)類型
這篇文章主要介紹了python的變量和數(shù)據(jù)類型,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下2021-10-10flask中使用SQLAlchemy進(jìn)行輔助開發(fā)的代碼
在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來輔助開發(fā)2013-02-02python統(tǒng)計(jì)日志ip訪問數(shù)的方法
這篇文章主要介紹了python統(tǒng)計(jì)日志ip訪問數(shù)的方法,涉及Python操作日志文件及正則匹配的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-07-07關(guān)于python?DataFrame的合并方法總結(jié)
這篇文章主要介紹了關(guān)于python?DataFrame的合并方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python實(shí)現(xiàn)Excel文件的合并(以新冠疫情數(shù)據(jù)為例)
這篇將以新冠疫情數(shù)據(jù)為例,詳細(xì)介紹了如何利用Python實(shí)現(xiàn)合并Excel文件,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03Pycharm的Available Packages為空的解決方法
這篇文章主要介紹了Pycharm的Available Packages為空的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09