python數據分析之numpy
上一篇:python數據分析之matplotlib
爲什麼要學習numpy
numpy有三大優點:
- 快速
- 方便
- 科學計算的基礎庫
1.什麼是 numpy ?
一個在Python中做科學計算的基礎庫,重在數值計算,也是大部分Python科學計算庫的基礎庫,多用於在大型、多維數組上執行數值運算
2. numpy 基礎
2.1 numpy 創建數組(矩陣)
# coding=utf-8
import numpy as np
import random
# 使用numpy生成數組,得到ndarray的類型
t1 = np.array([1, 2, 3, ])
print(t1)
print(type(t1))
t2 = np.array(range(10))
print(t2)
print(type(t2))
t3 = np.arange(4, 10, 2)
print(t3)
print(type(t3))
print(t3.dtype)
print("*" * 100)
# numpy中的數據類型
t4 = np.array(range(1, 4), dtype="i1")
print(t4)
print(t4.dtype)
# numpy中的bool類型
t5 = np.array([1, 1, 0, 1, 0, 0], dtype=bool)
print(t5)
print(t5.dtype)
# 調整數據類型
t6 = t5.astype("int8")
print(t6)
print(t6.dtype)
# numpy中的小數
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
t8 = np.round(t7, 2)
print(t8)
2.2 numpy 中常見的更多數據類型
常見的數據類型:int、float、string等等。
2.3 數據類型的操作
包括指定創建的數組的數據類型、修改數組的數據類型、修改浮點型的小數位數。
那麼問題來了,python中如何保留固定位數的小數?
參考鏈接:https://blog.csdn.net/whjstudy1/article/details/79528720
2.4 數組的形狀
主要包括:查看數組的形狀**.shape**、修改數組形狀**.reshape**
修改數組形狀不會改變原來數組的形狀
2.4 數組和數的計算
不同維度的數組是無法計算的,除非他們之間的行、列數有任意一個相同。
2.5 廣播原則
怎麼理解呢?
可以把維度指的是shape所對應的數字個數
那麼問題來了:
shape爲(3,3,3)的數組能夠和(3,2)的數組進行計算麼?
shape爲(3,3,2)的數組能夠和(3,2)的數組進行計算麼?
有什麼好處呢?
舉個例子:每列的數據減去列的平均值的結果
2.6 軸(axis)
0 軸表示列索引,1 軸表示行索引
2.7 numpy 讀取數據
CSV:Comma-Separated Value,逗號分隔值文件
顯示:表格狀態
源文件:換行和逗號分隔行列的格式化文本,每一行的數據表示一條記錄
由於csv便於展示,讀取和寫入,所以很多地方也是用csv的格式存儲和傳輸中小型的數據,爲了方便教學,我們會經常操作csv格式的文件,但是操作數據庫中的數據也是很容易的實現的。
import numpy as np
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
參數說明
2.8 numpy 中的轉置
轉置是一種變換,對於numpy中的數組來說,就是在對角線方向交換數據,目的也是爲了更方便的去處理數據
以上的三種方法都可以實現二維數組的轉置的效果,大家能夠看出來,轉置和交換軸的效果一樣
# coding=utf-8
import numpy as np
'''
轉置是一種變換,對於numpy中的數組來說,就是在對角線方向交換數據,目的也
是爲了更方便的去處理數據
常用方法:transpose()、.T和swapaxes(1,0)
'''
'''
# 轉置的方法
t=np.arange(24).reshape(4,6)
print(t)
print(t.transpose())
print(t.T)
print(t.swapaxes(1,0))
'''
us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path, delimiter=",", dtype=int, unpack=True)
t2 = np.loadtxt(us_file_path, delimiter=",", dtype=int)
# print(t1)
print("*" * 100)
print(t2)
print("*" * 100)
# 取行
print(t2[2])
# 取連續的多行
print("*" * 100)
print(t2[2:])
# 取不連續的多行
print("*" * 100)
print(t2[[2, 8, 10]])
# print(t2[1,:])
# print(t2[2:,:])
# print(t2[[2,10,3],:])
# 取列
print("*" * 100)
print(t2[:, 0])
# 取連續的多列
print("*" * 100)
print(t2[:, 2:])
# 取不連續的多列
print("*" * 100)
print(t2[:, [0, 2]])
# 取行和列,取第3行,第四列的值
print("*" * 100)
a = t2[2, 3]
print(a)
print(type(a))
# 取多行和多列,取第3行到第五行,第2列到第4列的結果
# 取的是行和列交叉點的位置
print("*" * 100)
b = t2[2:5, 1:4]
print(b)
# 取多個不相鄰的點
# 選出來的結果是(0,0) (2,1) (2,3)
print("*" * 100)
c = t2[[0, 2, 2], [0, 1, 3]]
print(c)
練習
現在這裏有一個英國和美國各自youtube1000多個視頻的點擊,喜歡,不喜歡,評論數量([“views”,“likes”,“dislikes”,“comment_total”])的csv,運用剛剛所學習的只是,我們嘗試來對其進行操作
數據來源:https://www.kaggle.com/datasnaek/youtube/data
補充:對於複製一個目錄到另外一個目錄下的命令 :先切換到所需要目錄,在輸入命令:cd -rf 文件 .
cp -rf ~/Documents/DataAnalysis/day03/code/youtube_video_data .
# coding="utf-8"
'''
現在希望把之前案例中兩個國家的數據方法一起來研究分析,
同時保留國家的信息(每條數據的國家來源),應該怎麼辦
'''
import numpy as np
us_data="./youtube_video_data/US_video_data_numbers.csv"
uk_data="./youtube_video_data/GB_video_data_numbers.csv"
# 1.加載國家數據
us_data = np.loadtxt(us_data,delimiter=",",dtype=int)
uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int)
print(us_data.shape[0],uk_data.shape[0])
'''
1688 1600
'''
# 2.添加國家信息
# 構造全爲0,1的數據
zeros_data=np.zeros((us_data.shape[0],1)).astype(int)
ones_data=np.ones((uk_data.shape[0],1)).astype(int)
# print(zeros_data)
# 分別添加一列全爲0,1的數組
us_data=np.hstack((us_data,zeros_data))
print(us_data)
'''
[[4394029 320053 5931 46245 0]
[7860119 185853 26679 0 0]
[5845909 576597 39774 170708 0]
...
[ 142463 4231 148 279 0]
[2162240 41032 1384 4737 0]
[ 515000 34727 195 4722 0]]
'''
uk_data=np.hstack((uk_data,ones_data))
print(uk_data)
'''
[[7426393 78240 13548 705 1]
[ 494203 2651 1309 0 1]
[ 142819 13119 151 1141 1]
...
[ 109222 4840 35 212 1]
[ 626223 22962 532 1559 1]
[ 99228 1699 23 135 1]]
'''
# 3.拼接兩組數據
final_data=np.vstack((us_data,uk_data))
print(final_data)
'''
[[4394029 320053 5931 46245 0]
[7860119 185853 26679 0 0]
[5845909 576597 39774 170708 0]
...
[ 109222 4840 35 212 1]
[ 626223 22962 532 1559 1]
[ 99228 1699 23 135 1]]
'''
那麼,結合之前的所學的matplotlib把英國和美國的數據呈現出來?
- 看到這個問題,我們應該考慮什麼?
- 我們想要反映出什麼樣的結果,解決什麼問題? 選擇什麼樣的呈現方式?
- 數據還需要做什麼樣的處理?
- 寫代碼
# coding="utf-8"
import numpy as np
import matplotlib.pyplot as plt
us_data="./youtube_video_data/US_video_data_numbers.csv"
uk_data="./youtube_video_data/GB_video_data_numbers.csv"
t_us = np.loadtxt(us_data,delimiter=",",dtype=int)
# 取評論數
t_us_comments=t_us[:,-1]
# 選擇比5000小的數據
t_us_comments=t_us_comments[t_us_comments<5000]
# 計算組數
d = 250 # 組距
bin_nums = (max(t_us_comments) - min(t_us_comments)) // d
# 繪圖
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums,density=False)
plt.savefig('./t_04.png')
plt.show()
2.9 numpy 索引和切片
對於剛剛加載出來的數據,我如果只想選擇其中的某一列(行)我們應該怎麼做呢?
其實操作很簡單,和python中列表的操作一樣
2.10 numpy 中數值的修改
修改行列的值,我們能夠很容易的實現,但是如果條件更復雜呢?
比如我們想要把t中小於10的數字替換爲3
2.11 numpy 中的布爾索引
2.12 numpy 中的三元運算
2.13 numpy 中的clip(裁剪)
2.14 numpy 中的nan和inf
numpy中的nan的注意點
3. numpy 中常用統計函數
3.1 ndarry缺失值填充均值
學習要學會總結,看到這裏你可以思考下列問題:
- 如何選擇一行或者多行的數據(列)?
- 如何給選取的行或者列賦值?
- 如何大於把大於10的值替換爲10?
- np.where如何使用?
- np.clip如何使用?
- 如何轉置(交換軸)?
- 讀取和保存數據爲csv
- np.nan和np.inf是什麼
- 常用的統計函數你記得幾個?
- 標準差反映出數據的什麼信息
練習
英國和美國各自youtube1000的數據結合之前的matplotlib繪製出各自的評論數量的直方圖
希望瞭解英國的youtube中視頻的評論數和喜歡數的關係,應該如何繪製改圖
# coding="utf-8"
import numpy as np
import matplotlib.pyplot as plt
us_data="./youtube_video_data/US_video_data_numbers.csv"
uk_data="./youtube_video_data/GB_video_data_numbers.csv"
t_us = np.loadtxt(us_data,delimiter=",",dtype=int)
# 取評論數
t_us_comments=t_us[:,-1]
# 選擇比5000小的數據
t_us_comments=t_us_comments[t_us_comments<5000]
# 計算組數
d = 250 # 組距
bin_nums = (max(t_us_comments) - min(t_us_comments)) // d
# 繪圖
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums,density=False)
plt.savefig('./t_04.png')
plt.show()
# coding="utf-8"
import numpy as np
import matplotlib.pyplot as plt
us_data = "./youtube_video_data/US_video_data_numbers.csv"
uk_data = "./youtube_video_data/GB_video_data_numbers.csv"
t_uk = np.loadtxt(uk_data, delimiter=",", dtype='int')
#選擇喜歡數比50萬小的數據
t_uk=t_uk[t_uk[:,1]<500000]
t_uk_comment=t_uk[:,-1]
t_uk_like=t_uk[:,1]
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_like,t_uk_comment)
plt.savefig('./t_05.png')
plt.show()
3.2 數組的拼接
現在我希望把之前案例中兩個國家的數據方法一起來研究分析,那麼應該怎麼做?
3.3 數組的行列交換
思考:現在希望把之前案例中兩個國家的數據方法一起來研究分析,同時保留國家的信息(每條數據的國家來源),應該怎麼辦?
3.4 numpy更多好用的方法
- 獲取最大值最小值的位置
- np.argmax(t,axis=0)
- np.argmin(t,axis=1)
- 創建一個全0的數組: np.zeros((3,4))
- 創建一個全1的數組:np.ones((3,4))
- 創建一個對角線爲1的正方形數組(方陣):np.eye(3)
3.5 numpy 生成隨機數
3.6 分佈的補充
3.7 numpy的注意點copy和view
下一篇: