玩數據必備Python庫之numpy使用詳解

前言

numpy 庫是 一個科學計算庫, 使用方法:import numpy as np

  • 用於快速處理任意維度的數組,存儲的對象是ndarray
  • 用於矩陣運算,存儲的對象是matrix

1. ndarray介紹

1. ndarray的屬性

item = np.array([[1, 2], [3, 4], [5, 6]])
# ndarray的屬性
print('shape 表示數組維度的元組', item.shape)  # (3, 2)
print('ndim 表示數組維數', item.ndim)  # 2
print('size 表示數組中元素個數', item.size)  # 6
print('itemsize 表示一個元素所占字節大小', item.itemsize)  # 4
print('dtype 表示數字元素的類型', item.dtype)  # int32

2. ndarray的形狀

ndarray可以是任意維度的數組

# ndarray的形狀
a1 = np.array([1, 2])
a2 = np.array([[1, 2], [3, 4]])
a3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print('a1是{0}維數組'.format(a1.ndim))
print('a2是{0}維數組'.format(a2.ndim))
print('a3是{0}維數組'.format(a3.ndim))
# a1是1維數組
# a2是2維數組
# a3是3維數組

3. ndarray的類型

創建ndarray對象時,可以使用dtype參數指定ndarray的類型

# ndarray的類型
item = np.array([[1, 2], [3, 4]], dtype=np.str_)	# 設置類型為字符串
print(item)
#[['1' '2']
# ['3' '4']]

2. ndarray的基本操作

生成數組

1. 生成0和1數組

# 生成一個3行4列的數組,元素為0。註意:默認類型為浮點型 0.
arr_zero = np.zeros([3, 4], dtype=int)
# 生成一個3行4列的數組,元素為1
arr_one = np.ones_like(arr_zero)

2. 從現有數組生成

array()

a = np.array([[1, 2, 3], [4, 5, 6]])
array = np.array(a)
print(array)

asarray()

asarray = np.asarray(a)
print(asarray)

array()和asarray()的區別

a[0, 0] = 100   # 修改元素值
print(array)    # array是深拷貝,修改原數據,現數據不變。相當於復制
print(asarray)  # asarray是淺拷貝,修改原數據,現數據改變。相當於創建快捷方式
# [[1 2 3]
#  [4 5 6]]
# [[100   2   3]
#  [  4   5   6]]

3. 生成固定范圍的數組

linspace(start, stop, num, endpoint) 固定個數,步長相等

# 從0到100,生成11個元素,默認包含stop值100,endpoint=True
arr = np.linspace(0, 100, 11)
print(arr)
# [  0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100.]

arange(start, stop, step, dtype) 固定步長

# 從0到50,固定步長10生成int類型元素,不包括stop值
arr2 = np.arange(0, 50, 10, np.int32)
print(arr2)
# [ 0 10 20 30 40]

logspace(start, stop, num) 生成10的N次冪的數據

# 從10^0開始到10^3結束,生成4個元素
arr3 = np.logspace(0, 3, 4)
print(arr3)
# [   1.   10.  100. 1000.]

4. 生成隨機數組 np.random模塊

4.1. 均勻分佈生成

rand(d0, d1, … , dn) 返回一個[0.0, 1.0)內的一組均勻分佈的數據

a1 = np.random.rand(2, 3)   
print(a1)

uniform(low, high, size) 從一個均勻分佈[low, high)中隨機采樣,可替代rand()方法 常用

a2 = np.random.uniform(1, 10, (2, 3))
print(a2)

randint(low, high, size) 從一個均勻分佈[low, high)中隨機采樣,生成N維整數數組

a3 = np.random.randint(1, 10, (2, 3))
print(a3)

生成均勻分佈數據的小案例

import matplotlib.pyplot as plt

# 1.準備數據 在[0,1)范圍內生成 100000000 個數據
x = np.random.uniform(0, 1, 100000000)
# 2.畫佈
plt.figure(figsize=(20,8), dpi=100)
# 3.繪制 x為數據, bins是要劃分的區間數
plt.hist(x=x, bins=1000)
# 4.顯示
plt.show()

數據分佈如圖所示:

4.2. 正態分佈生成

randn(d0, d1, … , dn) 從標準正態分佈中返回一個或多個樣本值

a1 = np.random.randn(2, 3)   
print(a1)

normal(loc, scale, size) loc均值,scale標準差,默認size=None,返回一個值 常用

a2 = np.random.normal(1.75, 1, (2, 3))
print(a2)

standard_normal(size) 返回指定形狀的標準正態分佈的數組

a3 = np.random.standard_normal((2, 3))
print(a3)

生成正態分佈數據的小案例

# 1.準備數據
x = np.random.normal(1.75, 1, 100000000)
# 2.畫佈
plt.figure(figsize=(20,8), dpi=100)
# 3.繪制 x為數據, bins是要劃分的區間數
plt.hist(x=x, bins=1000)
# 4.顯示
plt.show()

數據分佈如圖所示:

數組索引、切片

  • 直接索引,先對行索引,再對列索引
  • 高維數組索引,從宏觀到微觀
# 生成一個5行4列的隨機數組,范圍在40~100
score = np.random.randint(40, 100, (5, 4))
print(score)
# 獲取第一行,第三列的值
print(score[0, 2])
# 獲取前兩行,前三列的值,註意切片是[),左閉右開
print(score[0:2, 0:3])

修改數組形狀

reshape(shape[,order]) 返回一個新數組,原數組不變,行列順序不變

# 生成一個4行5列的隨機數組,范圍在40~100
score = np.random.randint(40, 100, (4, 5))
# 將數組修改為5行4列
a1 = score.reshape([5, 4])
print(a1)
# 若行為-1,表示行不固定,根據列的大小修改,但必須保證列的大小是總數的一個因數,否則會報錯
a2 = score.reshape([-1, 10])    # 元素總數為20,[-1, 10]表示 20/10 修改為2行10列
print(a2)

resize(shape[,order]) 無返回,改變原數組,行列順序不變

# 將數組修改為5行4列
score.resize([5, 4])
print(score)

T 返回一個新數組,原數組不變,行列順序改變

print(score.T)

修改數組類型

astype(dtype)

# 生成一個4行5列的隨機數組,范圍在[1,5) 類型為浮點型
score = np.random.uniform(1, 5, (4, 5))
# 修改數組類型為int
print(score.astype(np.int_))

數組去重

np.unique()

arr = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
print(np.unique(arr))
# [1 2 3 4 5 6]

刪除元素

np.delete(arr,obj,axis)

  • arr:ndarray數組
  • obj:刪除元素的位置或者條件
  • axis:指定刪除行或者列

3. ndarray運算

邏輯運算

  • 大於、小於直接進行比較
  • bool賦值,通過佈爾索引進行賦值
arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
# 邏輯判斷 如果值大於0,標記為True,否則為False
print(arr > 0)  # 大於、小於 直接進行比較
# bool賦值,通過佈爾索引進行賦值
arr[arr > 0] = 2    # 將大於0的元素賦值為2
print(arr)
# [[ 1.61640357 -0.21286798  0.67147044  1.07099177]
#  [ 0.87844707 -0.30592255  2.51825124 -0.53368643]
#  [ 0.85427772 -1.21688459 -0.81051012  0.77601911]]
# [[ True False  True  True]
#  [ True False  True False]
#  [ True False False  True]]
# [[ 2.         -0.21286798  2.          2.        ]
#  [ 2.         -0.30592255  2.         -0.53368643]
#  [ 2.         -1.21688459 -0.81051012  2.        ]]

通用判斷函數

  • np.all() 所有元素都滿足才會返回True
  • np.any() 任何一個元素滿足都會返回True
# 通用判斷函數
arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
# np.all()  所有元素都滿足才會返回True
print(np.all(arr > 0))
# np.any()  任何一個元素滿足都會返回True
print(np.any(arr > 0))

# [[ 2.96745424  1.13869564  2.42304826  1.00264569]
#  [ 1.09160352  1.67433992  0.80692908  0.87226686]
#  [-0.11395954 -0.10808592  2.67034408  1.06746313]]
# False
# True

三元運算符

  • np.where(表達式, value1, value2) 表達式為True,執行value1, 否則執行value2
  • 復合邏輯需要結合 np.logical_and() 或 np.logical_or() 使用
# 三元運算符
arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
# np.where(表達式, value1, value2)     表達式為True,執行value1, 否則執行value2
print(np.where(arr > 0, 1, 0))
# 復合邏輯需要結合 np.logical_and() 或 np.logical_or() 使用
print(np.where(np.logical_and(arr > 0.5, arr < 1), 1, 0))   # 大於0.5並且小於1
print(np.where(np.logical_or(arr > 0.5, arr < -0.5), 1, 0))   # 大於0.5或者小於-0.5
# [[-0.55217725  1.50314214  0.35100255  1.76121231]
#  [-0.47892572  1.7304177   1.19885493  0.28415964]
#  [ 0.83477297  0.76201994  0.40926624  0.95691155]]
# [[0 1 1 1]
#  [0 1 1 1]
#  [1 1 1 1]]
# [[0 0 0 0]
#  [0 0 0 0]
#  [1 1 0 1]]
# [[1 1 0 1]
#  [0 1 1 0]
#  [1 1 0 1]]

統計運算

  • min() 最小值
  • max() 最大值
  • mean() 均值
  • std() 標準差
  • var() 方差
  • argmin() 最小值的下標
  • argmax() 最大值的下標

統計時,還可以指定統計軸axis(行或者列),在每個軸上進行統計, axis軸的取值並不固定,在本例中,axis 0表示列,1表示行

arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
print(np.max(arr))  # 最大值
print(np.max(arr, axis=1))  # 每行的最大值
# [[ 0.25961034  0.56145924  0.71150806 -0.17447214]
#  [ 0.70701591 -0.16176053  0.24923484  0.48678436]
#  [ 1.21328659 -0.15891988  1.69161668  1.42672955]]
# 1.6916166794484437
# [0.71150806 0.70701591 1.69161668]

數組運算

數組與標量運算

對應元素直接進行運算

arr = np.array([1, 0, 5])
print(arr)
print(arr + 2)
print(arr * 2)
# [1 0 5]
# [3 2 7]
# [ 2  0 10]

數組與數組運算

數組之間的運算需要滿足廣播機制才可以運算,兩個條件

  • 維度相等
  • shape(其中相對應的一個地方為1)

條件可以表示為:

可以運算:
A       (3d array): 5 x 4 x 7
B       (3d array): 5 x 1 x 1
Result  (3d array): 5 x 4 x 7

A       (4d array): 9 x 1 x 7 x 1
B       (3d array):     8 x 1 x 5
Result  (4d array): 9 x 8 x 7 x 5

A       (2d array): 5 x 4
B       (1d array):     1
Result  (2d array): 5 x 4

不可以運算:
A       (1d array): 10
B       (1d array): 12
A       (2d array): 2 x 1
B       (3d array): 4 x 3 x 2
arr = np.array([1, 0, 5])
arr2 = np.array([2, 1, 1, 4])
print(arr + arr2)
# ValueError: operands could not be broadcast together with shapes (3,) (4,)

a = np.array([[1, 2, 3, 2, 1, 4]])  # A         (2d array):     1 x 6
b = np.array([[[1], [3], [4]]])     # B         (3d array): 1 x 3 x 1
                                    # Result    (3d array): 1 x 3 x 6
print(a + b , '新數組的shade是{}'.format((a+b).shape))
# [[[2 3 4 3 2 5]
#   [4 5 6 5 4 7]
#   [5 6 7 6 5 8]]] 新數組的shade是(1, 3, 6)

4. matrix 矩陣介紹

矩陣和向量

矩陣(matrix),和數組的區別:矩陣隻能是二維的,數組可以是多維的

向量:向量是一種特殊的矩陣,一般都是列向量

加法和常量乘法

矩陣的加法:行列數相等才能相加

矩陣的常量乘法:每個元素都要乘

矩陣間的乘法

兩個矩陣相乘,隻有第一個矩陣的列數等於第二個矩陣的行數才能相乘,即:(M行,N列) × (N行,L列) = (M行,L列)

矩陣乘法的性質

(1) 結合律: (AB)C=A(BC)

(2) 分配律:(左分配律)C(A+B)=CA+CB
        (右分配律)(A+B)C=AC+BC

(3) 對常量的結合性:k(AB)=(kA)B=A(kB)

單位矩陣

  • 從左上角到右下角的對角線均為1,其餘元素都為0的矩陣

逆矩陣

  • 矩陣A × 矩陣B = 單位矩陣,則A和B互為逆矩陣

轉置矩陣

  • 行和列互換的矩陣

5. Python中矩陣運算

  • np.matmul() 兩個矩陣相乘
  • np.dot() 兩個矩陣相乘或者矩陣與標量相乘
arr1 = np.random.randint(1, 7, (3, 2)) # 3 x 2 矩陣
arr2 = np.random.randint(2, 5, (2, 4)) # 2 x 4 矩陣
print(arr1)
print(arr2)
print(np.matmul(arr1, arr2))  # 結果為 3 x 4 矩陣
# print(np.dot(arr1, arr2))

# np.dot() 支持與標量相乘
print(np.dot(arr1, 5))  # 結果為 3 x 2 矩陣
# [[6 5]
#  [2 1]
#  [5 1]]
# [[2 2 3 4]
#  [4 2 3 2]]
# [[32 22 33 34]
#  [ 8  6  9 10]
#  [14 12 18 22]]
# [[30 25]
#  [10  5]
#  [25  5]]

擴展:正態分佈簡介

正態分佈是一種概率分佈。正態分佈是具有兩個參數μ和σ²的連續型隨機變量的分佈,第一參數μ是服從正態分佈的隨機變量的均值,第二個參數σ²是此隨機變量的方差,所以正態分佈記作N(μ,σ²)

正態分佈圖

均值:圖形的左右位置

方差:圖形是瘦還是胖

  • 方差越小,圖形越瘦高,數據越集中
  • 方差越大,圖形越矮胖,數據越分散

方差

  • 方差是在概率論和統計方差衡量隨機變量或一組數據時離散程度的度量。

總結

到此這篇關於玩數據必備Python庫之numpy使用詳解的文章就介紹到這瞭,更多相關Python庫之numpy使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: