文章目錄
- 第一部分 爲什麼要用Numpy
- 第二部分 Numpy數組的創建
- 2.1 從列表開始創建
- 2.2 從頭創建數組
- 2.2.1 np.zeros 創建值都爲0的數組
- 2.2.2 np.ones 創建一個值都爲1的數組
- 2.2.3 np.full 創建一個值都爲指定數字的數組
- 2.2.4 np.eye 創建一個單位矩陣
- 2.2.5 np.arange 創建一個線性序列數組
- 2.2.6 np.linspace 創建一個等差數列
- 2.2.7 np.logspace 創建一個等比數列
- 2.2.8 np.random.random 創建一個在0~1之間均勻分佈的隨機數構成的數組
- 2.2.9 np.random.rand 創建一個在0~1之間均勻分佈的隨機數構成的數組
- 2.2.10 np.random.normal 創建一個正態分佈隨機數構成的數組
- 2.2.11 np.random.randn 創建一個標準正態分佈隨機數構成的數組
- 2.2.12 np.random.randint 創建隨機整數構成的數組
- 2.2.13 隨機重排列
- 2.2.14 np.random.choice 按指定形狀隨機採樣,可指定概率
- 第三部分 Numpy數組的性質
- 3.1 數組的屬性
- 3.2 數組的索引
- 3.3 數組的切片
- 3.4 數組的變形
- 3.4.1 reshape——視圖
- 3.4.2 一維向量轉行向量 reshape、np.newaxis——視圖
- 3.4.3 一維向量轉列向量 reshape、np.newaxis——視圖
- 3.4.4 多維向量轉一維向量
- 3.5 數組的拼接
- 3.6 數組的分割
- 3.7 根據索引數組生成數組——副本
- 第四部分 Numpy四大運算
- 4.1 向量運算
- 4.1.1 與數字的加減乘除等
- 4.1.2 絕對值、三角函數、指數、對數
- 絕對值 abs、np.abs
- 三角函數 np.sin、np.cos、np.tan、np.arcsin、np.arccos、np.arctan
- 指數運算 np.exp
- 對數運算 np.log、np.log2、np.log10
- 4.1.3 兩個數組的運算——對應位置元素分別運算
- 4.2 矩陣運算
- 4.3 廣播運算
- 4.4 比較運算和掩碼——邏輯運算要用 & 而不能用 and !!!
- 第五部分 其他Numpy通用函數
第一部分 爲什麼要用Numpy
1.1 低效的Python for循環
- 【例】 求100萬個數的倒數
def compute_reciprocals(values):
res = []
for value in values: # 每遍歷到一個元素,就要判斷其類型,並查找適用於該數據類型的正確函數
res.append(1/value)
return res
values = list(range(1, 1000000))
%timeit compute_reciprocals(values)
100 ms ± 822 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
- %timeit :ipython中統計運行時間的魔術方法(多次運行取平均值)
import numpy as np
values = np.arange(1, 1000000)
%timeit 1/values
4.28 ms ± 285 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
- 實現相同計算,Numpy的運行速度是Python循環的25倍,產生了質的飛躍
1.2 Numpy爲什麼如此高效
- Numpy 是由C語言編寫的
- 編譯型語言VS解釋型語言
C語言執行時,對代碼進行整體編譯,速度更快。 - 連續單一類型存儲VS分散多變類型存儲
(1)Numpy數組內的數據類型必須是統一的,如全部是浮點型,而Python列表支持任意類型數據的填充。
(2)Numpy數組內的數據連續存儲在內存中,而Python列表的數據分散在內存中。
這種存儲結構,與一些更加高效的底層處理方式更加的契合。 - 多線程VS線程鎖
Python語言執行時有線程鎖,無法實現真正的多線程並行,而C語言可以。
1.3 什麼時候用Numpy
- 在數據處理的過程中,遇到使用“Python for循環” 實現一些向量化、矩陣化操作的時候,要優先考慮用Numpy。
- 如:兩個向量的點乘、矩陣乘法
第二部分 Numpy數組的創建
2.1 從列表開始創建
import numpy as np
x = np.array([1, 2, 3, 4, 5])
print(x)
print(type(x))
print(x.shape)
[1 2 3 4 5]
<class 'numpy.ndarray'>
(5,)
設置數組的數據類型
import numpy as np
x = np.array([1, 2, 3, 4, 5], dtype="float32")
print(x)
print(type(x[0]))
[1. 2. 3. 4. 5.]
<class 'numpy.float32'>
二維數組
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(x)
print(x.shape)
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3)
2.2 從頭創建數組
2.2.1 np.zeros 創建值都爲0的數組
import numpy as np
print(np.zeros(5, dtype=int))
[0 0 0 0 0]
2.2.2 np.ones 創建一個值都爲1的數組
import numpy as np
print(np.ones((2, 4), dtype=float))
[[1. 1. 1. 1.]
[1. 1. 1. 1.]]
2.2.3 np.full 創建一個值都爲指定數字的數組
import numpy as np
print(np.full((3, 5), 8.8))
[[8.8 8.8 8.8 8.8 8.8]
[8.8 8.8 8.8 8.8 8.8]
[8.8 8.8 8.8 8.8 8.8]]
2.2.4 np.eye 創建一個單位矩陣
import numpy as np
print(np.eye(3))
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
2.2.5 np.arange 創建一個線性序列數組
import numpy as np
print(np.arange(1, 15, 2)) # 從1開始,到15結束,步長爲2
[ 1 3 5 7 9 11 13]
2.2.6 np.linspace 創建一個等差數列
import numpy as np
print(np.linspace(0, 1, 4)) # 四個數均勻的分配到0~1
[0. 0.33333333 0.66666667 1. ]
2.2.7 np.logspace 創建一個等比數列
import numpy as np
print(np.logspace(0, 9, 10)) # 10個元素形成10^0~10^9的等比數列
[1.e+00 1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09]
2.2.8 np.random.random 創建一個在0~1之間均勻分佈的隨機數構成的數組
import numpy as np
print(np.random.random((3,3)))
[[0.43103112 0.90163353 0.97183695]
[0.11083239 0.10790603 0.25855347]
[0.58590392 0.49101639 0.43734257]]
2.2.9 np.random.rand 創建一個在0~1之間均勻分佈的隨機數構成的數組
import numpy as np
print(np.random.rand(3,3))
[[0.43103112 0.90163353 0.97183695]
[0.11083239 0.10790603 0.25855347]
[0.58590392 0.49101639 0.43734257]]
2.2.10 np.random.normal 創建一個正態分佈隨機數構成的數組
import numpy as np
print(np.random.normal(0, 1, (3,3))) # 形狀3*3,均值爲0,標準差爲1
[[ 0.71657085 0.2826025 -0.34395535]
[ 0.16207986 0.33397837 -0.16482997]
[-0.50180039 -1.18629584 0.17830969]]
2.2.11 np.random.randn 創建一個標準正態分佈隨機數構成的數組
import numpy as np
print(np.random.randn(3,3)) # 等價於np.random.normal(0, 1, (3,3))
[[ 0.08651861 -0.24051704 0.70060128]
[-1.20089869 0.835285 0.47519735]
[-1.41045256 0.50119295 -1.46519798]]
2.2.12 np.random.randint 創建隨機整數構成的數組
import numpy as np
print(np.random.randint(0, 10, (3,3))) # 形狀3*3,在[0,10)之間
print(np.random.randint(10, size=(3,3)))
[[2 9 8]
[5 4 8]
[8 8 3]]
[[1 4 0]
[5 9 2]
[4 0 1]]
2.2.13 隨機重排列
np.random.permutation 產生新列表
np.random.shuffle 修改原列表
import numpy as np
x = np.array([10, 20, 30, 40])
print(np.random.permutation(x)) # 產生新列表
print(x)
np.random.shuffle(x) # 修改原列表
print(x)
[30 10 40 20]
[10 20 30 40]
[10 30 20 40]
2.2.14 np.random.choice 按指定形狀隨機採樣,可指定概率
import numpy as np
x = np.arange(10, 25, dtype = float)
print(x)
print(np.random.choice(x, size=(4, 3)))
print(np.random.choice(10, 5)) # 在0到9中採樣5次
print(np.random.choice(x, 5, p=x/np.sum(x))) # 指定概率
[10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.]
[[22. 11. 21.]
[19. 15. 18.]
[11. 10. 11.]
[22. 14. 24.]]
[8 7 0 5 4]
[23. 11. 15. 17. 22.]
第三部分 Numpy數組的性質
3.1 數組的屬性
數組的形狀 shape
數組的維度 ndim
數組的大小 size
數組的數據類型 dtype
import numpy as np
x = np.random.randint(10, size=(3, 4))
print(x)
print(x.shape)
print(x.ndim)
y = np.arange(10)
print(y.ndim)
print(x.size)
print(x.dtype)
[[3 0 9 7]
[2 1 1 8]
[0 5 8 3]]
(3, 4)
2
1
12
int32
3.2 數組的索引
3.2.1 一維數組的索引——與列表一樣
import numpy as np
x1 = np.arange(10)
print(x1)
print(x1[0])
print(x1[-1])
[0 1 2 3 4 5 6 7 8 9]
0
9
3.2.2 多維數組的索引——以二維爲例
import numpy as np
x2 = np.random.randint(0, 20, (2,3))
print(x2)
print(x2[0, 0])
print(x2[0][0])
x2[0, 0] = 1.618
print(x2)
[[11 8 9]
[ 8 7 0]]
11
11
[[1 8 9]
[8 7 0]]
注意: numpy數組的數據類型是固定的,向一個整型數組插入一個浮點值,浮點值會向下進行取整
3.3 數組的切片
3.3.1 一維數組——跟列表一樣
import numpy as np
x1 = np.arange(10)
print(x1)
print(x1[:3])
print(x1[3:])
print(x1[::-1])
[0 1 2 3 4 5 6 7 8 9]
[0 1 2]
[3 4 5 6 7 8 9]
[9 8 7 6 5 4 3 2 1 0]
3.3.2 多維數組——以二維爲例
import numpy as np
x2 = np.random.randint(20, size=(3,4))
print(x2)
print(x2[:2, :3]) # 前兩行,前三列
print(x2[:2, 0:3:2]) # 前兩行 前三列(每隔一列)
print(x2[::-1, ::-1])
[[ 9 15 17 8]
[ 9 16 5 15]
[ 5 5 15 13]]
[[ 9 15 17]
[ 9 16 5]]
[[ 9 17]
[ 9 5]]
[[13 15 5 5]
[15 5 16 9]
[ 8 17 15 9]]
3.3.3 獲取數組的行和列
import numpy as np
x3 = np.random.randint(20, size=(3,4))
print(x3)
print(x3[1, :]) #第一行 從0開始計數
print(x3[1]) # 第一行簡寫
print(x3[:, 2]) # 第二列 從0開始計數
[[18 11 14 1]
[14 12 0 12]
[ 6 9 11 13]]
[14 12 0 12]
[14 12 0 12]
[14 0 11]
3.3.4 切片獲取的是視圖,而非副本
import numpy as np
x4 = np.random.randint(20, size=(3,4))
print(x4)
x5 = x4[:2, :2]
print(x5)
x5[0, 0] = 0
print(x5)
print(x4)
[[ 3 19 9 0]
[17 3 8 16]
[11 19 2 5]]
[[ 3 19]
[17 3]]
[[ 0 19]
[17 3]]
[[ 0 19 9 0]
[17 3 8 16]
[11 19 2 5]]
注意: 視圖元素髮生修改,則原數組亦發生相應修改
修改切片的安全方式:copy()
import numpy as np
x4 = np.random.randint(20, size=(3,4))
print(x4)
x6 = x4[:2, :2].copy()
print(x6)
x6[0, 0] = 0
print(x6)
print(x4)
[[15 15 13 17]
[16 13 14 6]
[ 6 18 3 15]]
[[15 15]
[16 13]]
[[ 0 15]
[16 13]]
[[15 15 13 17]
[16 13 14 6]
[ 6 18 3 15]]
3.4 數組的變形
3.4.1 reshape——視圖
import numpy as np
x5 = np.random.randint(0, 10, (12,))
print(x5)
x6 = x5.reshape(3, 4)
print(x6)
x6[0, 0] = 0
print(x5)
[1 2 6 7 9 3 3 9 4 7 5 6]
[[1 2 6 7]
[9 3 3 9]
[4 7 5 6]]
[0 2 6 7 9 3 3 9 4 7 5 6]
3.4.2 一維向量轉行向量 reshape、np.newaxis——視圖
import numpy as np
x5 = np.random.randint(0, 10, (12,))
print(x5)
x7 = x5.reshape(1, x5.shape[0])
print(x7)
x8 = x5[np.newaxis, :]
print(x8)
[8 8 8 4 8 1 3 9 1 8 0 2]
[[8 8 8 4 8 1 3 9 1 8 0 2]]
[[8 8 8 4 8 1 3 9 1 8 0 2]]
3.4.3 一維向量轉列向量 reshape、np.newaxis——視圖
import numpy as np
x5 = np.random.randint(0, 10, (5,))
print(x5)
x7 = x5.reshape(x5.shape[0], 1)
print(x7)
x8 = x5[:, np.newaxis]
print(x8)
[8 8 4 5 6]
[[8]
[8]
[4]
[5]
[6]]
[[8]
[8]
[4]
[5]
[6]]
3.4.4 多維向量轉一維向量
flatten()——副本
import numpy as np
x6 = np.random.randint(0, 10, (3, 4))
print(x6)
x9 = x6.flatten()
print(x9)
[[9 3 2 6]
[9 0 6 2]
[3 9 7 8]]
[9 3 2 6 9 0 6 2 3 9 7 8]
ravel()——視圖
import numpy as np
x6 = np.random.randint(0, 10, (3, 4))
print(x6)
x10 = x6.ravel()
print(x10)
[[4 5 1 9]
[2 5 3 0]
[4 5 5 2]]
[4 5 1 9 2 5 3 0 4 5 5 2]
reshape(-1)——視圖
import numpy as np
x6 = np.random.randint(0, 10, (3, 4))
print(x6)
x11 = x6.reshape(-1)
print(x11)
[[8 2 4 5]
[0 3 3 7]
[7 5 0 7]]
[8 2 4 5 0 3 3 7 7 5 0 7]
3.5 數組的拼接
3.5.1 水平拼接 np.hstack([x1, x2])、np.c_[x1, x2]——副本
import numpy as np
x1 = np.array([[1, 2, 3],
[4, 5, 6]])
x2 = np.array([[7, 8, 9],
[0, 1, 2]])
x3 = np.hstack([x1, x2])
print(x3)
x4 = np.c_[x1, x2]
print(x4)
[[1 2 3 7 8 9]
[4 5 6 0 1 2]]
[[1 2 3 7 8 9]
[4 5 6 0 1 2]]
3.5.2 垂直拼接np.vstack([x1, x2])、np.r_[x1, x2]——副本
import numpy as np
x1 = np.array([[1, 2, 3],
[4, 5, 6]])
x2 = np.array([[7, 8, 9],
[0, 1, 2]])
x5 = np.vstack([x1, x2])
print(x5)
x6 = np.r_[x1, x2]
print(x6)
[[1 2 3]
[4 5 6]
[7 8 9]
[0 1 2]]
[[1 2 3]
[4 5 6]
[7 8 9]
[0 1 2]]
3.6 數組的分割
3.6.1 split的用法——視圖
import numpy as np
x6 = np.arange(10)
print(x6)
x1, x2, x3 = np.split(x6, [2, 7])
print(x1, x2, x3)
[0 1 2 3 4 5 6 7 8 9]
[0 1] [2 3 4 5 6] [7 8 9]
3.6.2 hsplit的用法——視圖
import numpy as np
x7 = np.arange(1, 16).reshape(3, 5)
print(x7)
left, middle, right = np.hsplit(x7, [2,4])
print("left:\n", left) # 第0~1列
print("middle:\n", middle) # 第2~3列
print("right:\n", right) # 第4列
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
left:
[[ 1 2]
[ 6 7]
[11 12]]
middle:
[[ 3 4]
[ 8 9]
[13 14]]
right:
[[ 5]
[10]
[15]]
3.6.3 vsplit的用法——視圖
import numpy as np
x7 = np.arange(1, 16).reshape(5, 3)
print(x7)
upper, middle, lower = np.vsplit(x7, [2,4])
print("upper:\n", upper) # 第0~1行
print("middle:\n", middle) # 第2~3行
print("lower:\n", lower) # 第4行
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]
upper:
[[1 2 3]
[4 5 6]]
middle:
[[ 7 8 9]
[10 11 12]]
lower:
[[13 14 15]]
3.7 根據索引數組生成數組——副本
3.7.1 一維數組
import numpy as np
x = np.random.randint(100, size=10)
print(x)
ind = [2, 6, 9]
print(x[ind])
ind = np.array([[1, 0],
[2, 3]])
print(x[ind])
[72 74 19 52 14 98 22 67 52 99]
[19 22 99]
[[74 72]
[19 52]]
3.7.2 多維數組
import numpy as np
x = np.arange(12).reshape(3, 4)
print(x)
row = np.array([0, 1, 2])
col = np.array([1, 3, 0])
print(x[row, col]) # x(0, 1) x(1, 3) x(2, 0)
print(row[:, np.newaxis]) # 列向量
print(x[row[:, np.newaxis], col]) # 廣播機制
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[1 7 8]
[[0]
[1]
[2]]
[[ 1 3 0]
[ 5 7 4]
[ 9 11 8]]
第四部分 Numpy四大運算
4.1 向量運算
4.1.1 與數字的加減乘除等
import numpy as np
x1 = np.arange(1,6)
print(x1)
print("x1+5", x1+5)
print("x1-5", x1-5)
print("x1*5", x1*5)
print("x1/5", x1/5)
print("-x1", -x1)
print("x1**2", x1**2)
print("x1//2", x1//2)
print("x1%2", x1%2)
[1 2 3 4 5]
x1+5 [ 6 7 8 9 10]
x1-5 [-4 -3 -2 -1 0]
x1*5 [ 5 10 15 20 25]
x1/5 [0.2 0.4 0.6 0.8 1. ]
-x1 [-1 -2 -3 -4 -5]
x1**2 [ 1 4 9 16 25]
x1//2 [0 1 1 2 2]
x1%2 [1 0 1 0 1]
4.1.2 絕對值、三角函數、指數、對數
絕對值 abs、np.abs
import numpy as np
x2 = np.array([1, -1, 2, -2, 0])
print(x2)
print(abs(x2))
print(np.abs(x2))
[ 1 -1 2 -2 0]
[1 1 2 2 0]
[1 1 2 2 0]
三角函數 np.sin、np.cos、np.tan、np.arcsin、np.arccos、np.arctan
import numpy as np
theta = np.linspace(0, np.pi, 3)
print(theta)
print("sin(theta)", np.sin(theta))
print("cos(theta)", np.cos(theta))
print("tan(theta)", np.tan(theta))
x = [1, 0 ,-1]
print("arcsin(x)", np.arcsin(x))
print("arccon(x)", np.arccos(x))
print("arctan(x)", np.arctan(x))
[0. 1.57079633 3.14159265]
sin(theta) [0.0000000e+00 1.0000000e+00 1.2246468e-16]
cos(theta) [ 1.000000e+00 6.123234e-17 -1.000000e+00]
tan(theta) [ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
arcsin(x) [ 1.57079633 0. -1.57079633]
arccon(x) [0. 1.57079633 3.14159265]
arctan(x) [ 0.78539816 0. -0.78539816]
指數運算 np.exp
import numpy as np
x = np.arange(3)
print(x)
print(np.exp(x))
對數運算 np.log、np.log2、np.log10
import numpy as np
x = np.array([1, 2, 4, 8 ,10])
print("ln(x)", np.log(x))
print("log2(x)", np.log2(x))
print("log10(x)", np.log10(x))
ln(x) [0. 0.69314718 1.38629436 2.07944154 2.30258509]
log2(x) [0. 1. 2. 3. 3.32192809]
log10(x) [0. 0.30103 0.60205999 0.90308999 1. ]
4.1.3 兩個數組的運算——對應位置元素分別運算
import numpy as np
x1 = np.arange(1,6)
print(x1)
x2 = np.arange(6,11)
print(x2)
print("x1+x2:", x1+x2)
print("x1-x2:", x1-x2)
print("x1*x2:", x1*x2)
print("x1/x2:", x1/x2)
[1 2 3 4 5]
[ 6 7 8 9 10]
x1+x2: [ 7 9 11 13 15]
x1-x2: [-5 -5 -5 -5 -5]
x1*x2: [ 6 14 24 36 50]
x1/x2: [0.16666667 0.28571429 0.375 0.44444444 0.5 ]
4.2 矩陣運算
4.2.1 矩陣的轉置 x.T——視圖
import numpy as np
x = np.arange(9).reshape(3, 3)
print(x)
y = x.T
print(y)
[[0 1 2]
[3 4 5]
[6 7 8]]
[[0 3 6]
[1 4 7]
[2 5 8]]
4.2.2 矩陣乘法 x.dot(y)、np.dot(x, y)
import numpy as np
x = np.array([[1, 0],
[1, 1]])
y = np.array([[0, 1],
[1, 1]])
print(x.dot(y))
print(np.dot(x, y))
print(x*y)
[[0 1]
[1 2]]
[[0 1]
[1 2]]
[[0 0]
[1 1]]
- 注意跟x * y的區別,x * y是對應位置元素相乘
4.3 廣播運算
- 規則
如果兩個數組的形狀在維度上不匹配
那麼數組的形式會沿着維度爲1的維度進行擴展以匹配另一個數組的形狀。
import numpy as np
x = np.arange(3).reshape(1, 3)
print(x)
print(x+5) # 先把5擴展成1×3的形狀,再相加
[[0 1 2]]
[[5 6 7]]
import numpy as np
x1 = np.ones((3,3))
print(x1)
x2 = np.arange(3).reshape(1, 3)
print(x2)
print(x1+x2) # 先把1×3擴展成3×3的形狀,再相加
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
[[0 1 2]]
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]
import numpy as np
x5 = np.arange(3).reshape(3, 1)
print(x5)
x6 = np.arange(3).reshape(1, 3)
print(x6)
print(x5+x6) # 分別擴展成3×3的形狀,再相加
[[0]
[1]
[2]]
[[0 1 2]]
[[0 1 2]
[1 2 3]
[2 3 4]]
4.4 比較運算和掩碼——邏輯運算要用 & 而不能用 and !!!
4.4.1 比較運算
import numpy as np
x1 = np.random.randint(100, size=(3,3))
print(x1)
print(x1 > 50)
[[38 38 79]
[ 3 54 97]
[23 31 19]]
[[False False True]
[False True True]
[False False False]]
4.4.2 操作布爾數組 np.sum(統計個數)、np.all、np.any
import numpy as np
x2 = np.random.randint(10, size=(3, 4))
print(x2)
print(x2 > 5)
print(np.sum(x2 > 5)) # 大於5的元素有幾個
print(np.all(x2 > 0)) # 所有都滿足條件
print(np.any(x2 == 6)) # 至少一個滿足條件
print((x2 < 9, axis=1).all()) # 每行的元素是否都小於9,axis=0爲按列
print((x2 < 9) & (x2 >5))
print(((x2 < 9) & (x2 >5)).sum()) # 加入邏輯運算
[[8 3 9 3]
[3 3 8 1]
[9 2 8 8]]
[[ True False True False]
[False False True False]
[ True False True True]]
6
True
False
[False True False]
[[ True False False False]
[False False True False]
[False False True True]]
4
4.4.2 將布爾數組作爲掩碼——副本
import numpy as np
x2 = np.random.randint(10, size=(3, 4))
print(x2)
print(x2 > 5)
print(x2[x2 > 5])
[[8 9 2 1]
[1 6 1 4]
[1 2 0 9]]
[[ True True False False]
[False True False False]
[False False False True]]
[8 9 6 9]
第五部分 其他Numpy通用函數
5.1 數值排序 np.sort(x)、x.sort()
import numpy as np
x = np.random.randint(20, 50, size=10)
print(x)
print(np.sort(x)) # 產生新的排序數組
print(x)
x.sort() # 替換原數組
print(x)
[44 20 21 41 35 44 32 45 29 28]
[20 21 28 29 32 35 41 44 44 45]
[44 20 21 41 35 44 32 45 29 28]
[20 21 28 29 32 35 41 44 44 45]
獲得排序索引 np.argsort(x)、x.argsort()
import numpy as np
x = np.random.randint(20, 50, size=10)
print(x)
i = np.argsort(x)
print(i)
print(x.argsort())
[20 47 24 26 24 44 44 41 40 36]
[0 2 4 3 9 8 7 5 6 1]
[0 2 4 3 9 8 7 5 6 1]
5.2 最大最小值及索引
import numpy as np
x = np.random.randint(20, 50, size=10)
print(x)
print("max:", np.max(x))
print("min:", x.min())
print("max_index:", x.argmax())
print("min_index:", np.argmin(x))
[26 48 24 29 35 23 47 37 46 26]
max: 48
min: 23
max_index: 1
min_index: 5
5.3 元素求和、求積
5.3.1 求和 np.sum(x)、x.sum()
axis指定維度,不指定則全體求和
keepdims指定是否保持數組維度,默認False
import numpy as np
x1 = np.arange(6).reshape(2,3)
print(x1)
print(np.sum(x1, axis=1)) # 按行求和
print(x1.sum(axis=1, keepdims=True))
print(np.sum(x1, axis=0)) # 按列求和
print(x1.sum(axis=0, keepdims=True))
print(np.sum(x1)) # 全體求和
print(x1.sum(keepdims=True))
[[0 1 2]
[3 4 5]]
[ 3 12]
[[ 3]
[12]]
[3 5 7]
[[3 5 7]]
15
[[15]]
5.3.2 求積 np.prod(x)、x.prod(),參數與求和一樣
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
print(x1)
print(x1.prod())
print(np.prod(x1))
[[1 2 3]
[4 5 6]]
720
720
5.4 中位數median、均值mean、方差var、標準差std
import numpy as np
x = np.random.normal(0, 1, size=10000)
print(np.median(x)) # 中位數 沒有x.median()的寫法
print(x.mean()) # 均值
print(np.mean(x))
print(x.var()) # 方差
print(np.var(x))
print(x.std()) # 標準差
print(np.std(x))
-0.0005526165156031632
-0.0031363778888049655
-0.0031363778888049655
0.993877024048911
0.993877024048911
0.9969338112677847
0.9969338112677847