前言
NumPy 是一個 Python 包。 它代表 “Numeric Python”。 它是一個由多維數組對象和用於處理數組的例程集合組成的庫,主要用來處理數組和矩陣。NumPy調用了大量的用C語言編寫的算法庫,使得其可以直接操作內存,不必進行Python動態語言特性所含有的前期類型檢查工作,從而大大提高了運算速度。
這篇文章介紹了numpy最常用的一些用法,敲一遍下面的代碼就算入門了。
導入
impotrt numpy as np
向量矩陣
vector = np.array([5, 10, 15, 20]) # 一維向量
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 矩陣
print(matrix)
[[1 2 3]
[4 5 6]
[7 8 9]]
print(matrix.ndim) # 維度
2
print(matrix.shape) # 形狀
(3, 3)
print(matrix.size) # 有多少元素
9
print(matrix.dtype) # 向量中的數據類型
int32
切片
vector = np.array([5, 10, 15, 20]) # 一維向量
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 矩陣
print(matrix[0,0]) # >> 5
print(vector[0:3]) # >> [5 10 15] 0~3表示0 1 2
print(matrix[:,1]) # >> [3 5 8] 此處冒號代表所有行
print(matrix[:,0:2]) # >> [[1 2], [4 5], [7 8]]
判斷操作
vector = np.array([5, 10, 15, 20]) # 一維向量
print(vector == 10)
([False, True, False, False])
數據類型轉換
vector = np.array([1, 2, 3]) # 數據類型是
print(vector.dtype)
int32
vector = vector.astype(float) # 類型轉換
print(vector.dtype)
float64
最值
vector.min() # 最大值
vector.max() # 最小值
對整行、列操作
matrix.sum(axis = 1) # 對行求和
matrix.sum(axis = 0) # 對列求和
range
range(stop) #或下面的
range(start, stop[, step]) #返回list對象,只能有整數
range(0, 5) 即從0到5,但不包括5,即0 1 2 3 4
range(0, 10, 2) 即從0到10,但不包括10,步幅爲2,
輸出爲:1, 3, 5, 7, 9
arange
arange([start,] stop[, step,], dtype=None)
#返回ndarray對象,numpy中的函數,與range相比,可以有浮點數
np.arange(10, 30, 5) # >> array([10, 15, 20 25]) 從10到30 間隔5 注意 30取不到
np.arange(15) # >> [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
data = np.arange(20).reshape(5,4)
print(data)
# 會輸出:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]]
range(data.shape[0]) # >> range(0, 5) 即從0到5,但不包括5,即0 1 2 3 4
range(data.shape[1]) # >> range(0,4)即從0到4,但不包括4,即 0 1 2 3
reshape
a = np.arange(15).reshape(3, 5) # array([0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14])
a.reshape(3,-1) # 確定了3行,-1是讓電腦自己算有幾列
初始化矩陣
np.zeros((3,4)) # 3行4列的元素全爲0的矩陣+
np.ones((5,6)) # 5行6列的元素全爲1的矩陣
np.ones((2,3,4), dtype=np.int32) # 默認是float類型,現在將類型換爲整數
np.random.random((2,3)) # 一個矩陣,元素是從-1到+1之間的隨機值
矩陣乘法
dot
①一維,計算內積,得到一個值
②多維,滿足矩陣相乘
import numpy as np
A.dot(B) # 正常矩陣相乘
np.dot(A,B) # 同上
outer
①對於多維向量,全部展開變爲一維向量
②第一個參數表示倍數,使得第二個向量每次變爲幾倍。
③第一個參數確定結果的行,第二個參數確定結果的列
import numpy as np
x1 = [1,2,3]
x2 = [4,5,6]
outer = np.outer(x1,x2)
print outer
[[ 4 5 6] #1倍
[ 8 10 12] #2倍
[12 15 18]] #3倍
x1 = [[1,2],[3,4]]
x2 = [[1,1],[1,1]]
outer = np.outer(x1,x2)
print outer
[[1 1 1 1] #1倍
[2 2 2 2] #2倍
[3 3 3 3] #3倍
[4 4 4 4]] #4倍
multiply和*
①對應位置相乘
②兩個參數和結果的shape應該一致
import numpy as np
A*B # 點乘(對應元素相乘)
np.multiply(A, B) # 同上
矩陣拼接、分割
np.hstack((a,b)) # 矩陣a和b橫着拼
np.vstack((a,b)) # 矩陣a和b縱着拼
np.hsplit(a,3) # 矩陣a平均切分爲3份
np.hsplit(a,(3,4)) # 矩陣a 從3處切一下,從4處切一下
np.split(GG,2,axis=1)
np.split(GG,3,axis=0)
# 若不能均分爲3份,上面兩個語句會出錯,用下面這個就ok了
print(np.array_split(A,3,axis=1))
複製
a = np.arange(12)
b = a # a和b是一個位置的不同名字,改變b, a也就跟着變了
b.shape = 3,4 # a.shape也就變成了 3,4
c = a.view() # c和a指向不同位置,但是共用同一套值
d = a.copy() # d和a互不影響
np.grgmax
ind = data.argmax(axis=0) # 每一列中最大元素的索引值
data_max = data[ind, range(data.shape[1])] # 找出每一列的最大值
ind1 = data.grgmax(axis=1) # 每一行中最大元素的索引值
# data[行號,列號] ,現在是找每行的最大值,ind裏是每行的最大值的位置,即列號
data_max = data[range(data.shape[0]),ind] # 找出每一行的最大值
np.tile
a = np.array([[3,1],[2,1]])
b = np.tile(a, (2,3)) # 將a的行的元素個數擴大兩倍,列的元素個數擴大3倍
print(a)
print(b)
[[3 1]
[2 1]]
[[3 1 3 1 3 1]
[2 1 2 1 2 1]
[3 1 3 1 3 1]
[2 1 2 1 2 1]]
np.linspace
b = np.linspace(1, 10, 5) # 線段 起始、結束、幾段
print(b)
[ 1. 3.25 5.5 7.75 10. ]
排序
a.sort() # a中元素從小到大排序
a.sort(reverse=True) # 從大到小排序
j = a.argsort(a) # a中元素從小到大排序的序列號
k = a[]
a[j] # 可以得到排序後的結果
其它
A = np.arange(2,14).reshape([3,4])
print(A)
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
print(np.argmax(A)) # 最大值索引
11
print(np.mean(A)) # 平均值
7.5
print(np.average(A)) # 平均值
7.5
print(np.median(A)) # 中位數
7.5
print(np.cumsum(A)) # 每個元素是之前所有元素相加的和
[ 2 5 9 14 20 27 35 44 54 65 77 90]
print(np.diff(A)) # 相鄰兩個元素之間的差
[[1 1 1]
[1 1 1]
[1 1 1]]
print(np.clip(A,5,9)) # 小於5變爲5,大於9變爲9
[[5 5 5 5]
[6 7 8 9]
[9 9 9 9]]