作者:小蝸牛愛學習
來源:https://blog.csdn.net/qq_42755939/article/details/107032142
一、Numpy讀取文件
loadtxt()方法
numpy.loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
參數 | 作用 |
---|---|
fname | 被讀取的文件名(文件的相對地址或者絕對地址) |
dtype | 指定讀取後數據的數據類型 |
comments | 跳過文件中指定開頭的行(即不讀取),比如comments=’#'表示不讀取以#開頭的數據 |
delimiter | 指定讀取文件中數據的分割符 |
converters | 對讀取的數據進行預處理 |
skiprows | 選擇跳過的行數 |
usecols | 指定需要讀取的列 |
unpack | 選擇是否將數據進行向量輸出,相當於將源數據轉置輸出 |
encoding | 對讀取的文件進行預編碼 |
import numpy as np
#讀取文件loadtxt()方法
GB_vido_path = "GB_video_data_numbers.csv"
US_vido_path = "US_video_data_numbers.csv"
t1 = np.loadtxt(GB_vido_path,dtype = "i8", delimiter=",")
t2 = np.loadtxt(US_vido_path,dtype="i8", delimiter=",")
print(t1)
print("*"*100)
print(t2)
二、數組轉置的三種方法
方法一:使用屬性T
方法二:使用方法transpose()
方法三:使用方法swapaxes()
arr01 = np.arange(2,8).reshape(2,3)
print("arr01:",arr01) #arr01: [[2 3 4] [5 6 7]]
#方法一:使用屬性T
arr02 = arr01.T
print("arr02:",arr02) #arr02: [[2 5] [3 6] [4 7]]
#方法二:使用方法transpose()
arr03 = arr01.transpose() #arr03: [[2 5] [3 6] [4 7]]
print("arr03:",arr03)
#方法三:使用方法
arr04 = arr01.swapaxes(1,0)
print("arr04:",arr04) #arr03: [[2 5] [3 6] [4 7]]
三、Numpy的索引與切片
#取數組中的行
t = np.arange(1,73).reshape(8,9)
print(t)
print("*"*100)
#取單值
t0 = t[2,3]
print("t0",t0)
#取多個值
print(t[[1,3],[5,6]])
#取一行
t1 = t[2] #取第三行
print("t1:",t1)
#取連續的多行
t2 = t[2:5]
print("t2",t2) #取第三行到第五行
#取不連續的多行
t3 = t[[2,4,5]]
print("t3:",t3)
#取數組中的列
#取某一列
t4 = t[:,2] #取第三列
print("t4:",t4)
#取連續的多列
t5 = t[:,2:5] #取第三到第五列
print("t5:",t5)
t6 = t[:,[1,3,7]] #取不連續的多列
print("t6:",t6)
#取連續的多行和多列
t7 = t[2:4,4:6]
print("t7:",t7)
四、修改numpy的值與bool索引
1、修改值
n1 = np.arange(1,64).reshape(7,9)
n1[:,2:5] = 0
print("n1:",n1)#將第三列到第五列的值改爲0
n2 = np.arange(1,64).reshape(7,9)
n2[n2>40] =40
print("n2:",n2) #將大於40的修改爲40
n3 = np.arange(1,64).reshape(7,9)
print(n3>40) #numpy的bool索引
2、Numpy中的三元運算
where()方法
r = np.arange(54).reshape(6,9)
print(np.where(r>30,30,0))#將r中大於30的修改30,小於30的修改爲0
3、numpy的clip()方法
arr = np.arange(1,29).reshape(4,7)
arr = arr.astype("float64")
arr[3:6,3:] = np.nan
print("arr:",arr) #arr: [[ 1. 2. 3. 4. 5. 6. 7.] [ 8. 9. 10. 11. 12. 13. 14.] [15. 16. 17. 18. 19. 20. 21.] [22. 23. 24. nan nan nan nan]]
arr1 = arr.clip(5,15) #將arr1中小於5的修改爲5,大於15的修改爲15,但是不會修改nan值
print("arr1:",arr1) #arr1: [[ 5. 5. 5. 5. 5. 6. 7.] [ 8. 9. 10. 11. 12. 13. 14.] [15. 15. 15. 15. 15. 15. 15.] [15. 15. 15. nan nan nan nan]]
五、Numpy中的nan和inf
1、什麼是nan?
nan(NAN,Nan):not a number 表示不是一個數字
2、numpy中會nan是如何產生的?
當我們讀取本地的文件爲float的時候,如果有缺失,就會出現nan,當做了一個不合適的計算的時候(比如無窮大減去無窮大)
3、inf
inf(-inf,inf) : infinity, +inf表示正無窮,-inf表示負無窮
注意1:什麼時候會出現inf包括(-inf,+inf)?
如一個數字除以0,(python中直接會報錯,numpy中是一個inf或者-inf)
注意2:那麼如何指定一個nan或者inf呢?
注意3:他們的type類型
a = np.nan
b = np.inf
print(type(a),type(b)) #<class 'float'> <class 'float'>
4、numpy中的nan的注意點
1、兩個nan不相等
print("兩個nan是否相等:",np.nan == np.nan) #兩個nan是否相等: False
print(np.nan != np.nan) #True
2、判斷一個數組裏面有幾個nan值
count_nonzero():判斷數組裏面0或者True的個數
arr1 = np.array([1., 2., 3., 4., np.nan, 5., np.nan])
print(arr1)
print(arr1 != arr1) #[False False False False True False True]
print(np.count_nonzero(arr1 != arr1)) #2
3、將nan值轉化爲0
np.isnan(arr)判斷數組中nan值
arr2 = arr1
print(np.isnan(arr2)) #[False False False False True False True]
arr1[np.isnan(arr2)] = 0
print(arr2) #[1. 2. 3. 4. 0. 5. 0.]
4、nan與任何值計算都爲nan
數據分析中nan值的處理
那麼問題來了,在一組數據中單純的把nan替換爲0,合適麼?會帶來什麼樣的影響?
比如,全部替換爲0後,替換之前的平均值如果大於0,替換之後的均值肯定會變小,所以更一般的方式是把缺失的數值替換爲均值(中值)或者是直接刪除有缺失值的一行
那如何計算一組數據的中值或者是均值?
六、Numpy中常用統計函數
1、求和:t.sum(axis=None)
2、均值:t.mean(a,axis=None) 受離羣點的影響較大
3、中值:np.median(t,axis=None)
4、最大值:t.max(axis=None)
5、最小值:t.min(axis=None)
6、極值:np.ptp(t,axis=None) 即最大值和最小值只差
7、標準差:t.std(axis=None)
注意:默認返回多維數組的全部的統計結果,如果指定axis則返回一個當前軸上的結果
七、數據清洗–Numpy如何處理缺失值填充均值
nan = np.nan
t = np.array([
[ nan, 1., nan, 7., 4., 18.],
[ 9., 2., nan, 9., 10., 11.],
[ nan, 13., 14., nan, 16., 88.],
[ 18., nan, 51., 20., nan, 63.]
])
def fill_nan_by_column_mean(t):
"""將列的平均值替換nan"""
for i in range(t.shape[1]):
#獲取當列的nan值的個數
nan_num = np.count_nonzero(t[:,1][t[:,i] != t[:,i]])
if nan_num > 0:
now_col = t[:,i]
#求當前列非nan值的和
now_col_num = now_col[t[:,i] == t[:,i]].sum()
#求平均值
avg = round((now_col_num / (now_col.shape[0] - nan_num)), 2)
#將平均值替代nan
now_col[np.isnan(now_col)] = avg
t[:,i] = now_col
return t
t = fill_nan_by_column_mean(t)
print(t)
#結果如下:
[
[13.5 1. 32.5 7. 4. 18. ]
[ 9. 2. 32.5 9. 10. 11. ]
[13.5 13. 14. 12. 16. 88. ]
[18. 5.33 51. 20. 10. 63. ]
]
推薦閱讀:
- 我精心整理的 136 頁 Excel 數據透視表 PDF 文件!【附獲取方式】
- 100天從 Python 小白到大神的學習資源,都在這了。
- 不吹不黑!GitHub 上幫助人們學習編碼的 12 個資源,錯過血虧…
- 我花了五個小時的時間,將全部文章詳細整理出來了,千萬不要錯過!
關注微信公衆號『傑哥的IT之旅』,後臺回覆“1024”查看更多內容,回覆“微信”添加我微信。