03_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把英國和美國的數據呈現出來?

  1. 看到這個問題,我們應該考慮什麼?
  2. 我們想要反映出什麼樣的結果,解決什麼問題? 選擇什麼樣的呈現方式?
  3. 數據還需要做什麼樣的處理?
  4. 寫代碼
# 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缺失值填充均值

在這裏插入圖片描述
學習要學會總結,看到這裏你可以思考下列問題:

  1. 如何選擇一行或者多行的數據(列)?
  2. 如何給選取的行或者列賦值?
  3. 如何大於把大於10的值替換爲10?
  4. np.where如何使用?
  5. np.clip如何使用?
  6. 如何轉置(交換軸)?
  7. 讀取和保存數據爲csv
  8. np.nan和np.inf是什麼
  9. 常用的統計函數你記得幾個?
  10. 標準差反映出數據的什麼信息
    練習
    英國和美國各自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更多好用的方法

  1. 獲取最大值最小值的位置
    • np.argmax(t,axis=0)
    • np.argmin(t,axis=1)
  2. 創建一個全0的數組: np.zeros((3,4))
  3. 創建一個全1的數組:np.ones((3,4))
  4. 創建一個對角線爲1的正方形數組(方陣):np.eye(3)

3.5 numpy 生成隨機數

在這裏插入圖片描述

3.6 分佈的補充

在這裏插入圖片描述

3.7 numpy的注意點copy和view

在這裏插入圖片描述
下一篇:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章