上一篇主要介紹了numpy的索引方法,這一篇介紹一些常用的方法。、
常見計算方法
import numpy as np
matrix = np.array([
[5, 10, 15],
[20, 25, 30],
[35, 40, 45]
])
#一些常見的計算方法:sum(),min(),max(),mean(),std(),sqrt(),exp()
#使用時直接調用就行了,注意axis這個參數,axis = 1表示對行計算,axis = 0對列計算
print("#求和")
print("按行",matrix.sum(axis = 1))
print("按列",matrix.sum(axis = 0))
print('-----------------')
print("#求均值和方差")
print(matrix.mean(axis = 1))
print(matrix.std(axis = 1))
print('-----------------')
print("#求最大最小值")
print(matrix.max(axis = 1))
print(matrix.min(axis = 1))
#求和
按行 [ 30 75 120]
按列 [60 75 90]
-----------------
#求均值和方差
[10. 25. 40.]
[4.0824829 4.0824829 4.0824829]
-----------------
#求最大最小值
[15 30 45]
[ 5 20 35]
指定維度
np.arange(n,m,i)函數生成一個以n開始,m結束,步長為i的array
#指定維度,np.reshape()
array = np.arange(8) #np.arange(n,m,i)函數生成一個以n開始,m結束,步長為i的array
print(array)
print(array.reshape(2,4)) #變為2*4的矩陣了
[0 1 2 3 4 5 6 7]
[[0 1 2 3]
[4 5 6 7]]
指定均分成幾塊
np.linspace(n,m,i),這個函數生成一個以n開始,m結束,均分為i份的array
# np.linspace(n,m,i),這個函數生成一個以n開始,m結束,均分為i份的array
print(np.linspace(0,9,10))
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
求對數和開方
np.exp() 返回自然對數以常數e為底數的對數
np.sqrt() 就是對數進行開方
# 求對數和開方
print("原數",matrix[:,0])
print("對數",np.exp(matrix[:,0])) #自然對數以常數e為底數的對數
print("開方",np.sqrt(matrix[:,0]))
原數 [ 5 20 35]
對數 [1.48413159e+02 4.85165195e+08 1.58601345e+15]
開方 [2.23606798 4.47213595 5.91607978]
取整方法
np.floor() 向下取整;
np.ceil() 向上取整;
np.trunc() 取整數部分;
np.rint() 四舍五入取整。
# 取整方法: np.floor()向下取整; np.ceil() 向上取整; np.trunc() 取整數部分; np.rint() 四舍五入取整。
array = np.random.normal(5,5,5)
#這個方法從正態分布中抽取隨機數,第一個參數是分布的平均值,第二個是標準偏差,第三個是樣本大小
print(array)
print("向下取整",np.floor(array))
print("向上取整",np.ceil(array))
print("取整數部分",np.trunc(array))
print("四舍五入取整",np.rint(array))
[ 9.95119225 -2.00380924 5.05684191 2.26461747 -4.45758977]
向下取整 [ 9. -3. 5. 2. -5.]
向上取整 [10. -2. 6. 3. -4.]
取整數部分 [ 9. -2. 5. 2. -4.]
四舍五入取整 [10. -2. 5. 2. -4.]
將矩陣拉平
np.ravel() 其實就是將矩陣按順序變為一個一維矩陣
#ravel() 方法可以將矩陣拉平
matrix = np.array([
[5, 10, 15],
[20, 25, 30],
[35, 40, 45]
])
print(matrix.ravel())
[ 5 10 15 20 25 30 35 40 45]
矩陣拼接
np.hstack() 橫向拼接
np.vstack() 縱向拼接
np.stack() 需要指定axis,而且會增加一個維度
#矩陣拼接
mat1 = np.array([
[5, 10],
[15, 20],
])
mat2 = np.array([
[50, 100],
[150, 200],
])
new_mat1 = np.hstack((mat1,mat2)) #橫向拼接
new_mat2 = np.vstack((mat1,mat2)) #縱向拼接
print(new_mat1)
print('---------------')
print(new_mat2)
#np.stack()方法也可拼接矩陣,但是會增加一個維度,同時需要指定axis
new_mat3 = np.stack((mat1,mat2),axis = 1)
print('---------------')
print(new_mat3)
[ 15 20 150 200]]
---------------
[[ 5 10]
[ 15 20]
[ 50 100]
[150 200]]
---------------
[[[ 5 10]
[ 50 100]]
[[ 15 20]
[150 200]]]
矩陣分割
np.hsplit() 橫向拼接
np.vsplit() 縱向拼接
np.split() 需要指定axis,默認是0
#切分矩陣
matrix = np.array([
[5, 10, 15],
[20, 25, 30],
[35, 40, 45]
])
print(np.hsplit(matrix,3)) #縱向切分 要注意維度要和你的矩陣一致,不然會報錯
print('----------------------------------------------')
print(np.vsplit(matrix,3)) #橫向切分
print(np.split(matrix,3,axis = 1)) #也可直接split(),但要指定axis,默認是0
[array([[ 5],
[20],
[35]]), array([[10],
[25],
[40]]), array([[15],
[30],
[45]])]
----------------------------------------------
[array([[ 5, 10, 15]]), array([[20, 25, 30]]), array([[35, 40, 45]])]
Out[75]:
[array([[ 5],
[20],
[35]]), array([[10],
[25],
[40]]), array([[15],
[30],
[45]])]
返回最大最小值索引
np.argmax() 不指定axis時會默認算整個矩陣的最大值索引(不過這個索引是拉平后的,需要是可以先ravel一下),指定后按行或按列求,對于argmin()也一樣。
np.argmin()
# 返回最大最小值索引
matrix = np.array([
[15, 50, 10],
[20, 40, 30],
[35, 5, 45]
])
MAX_index = np.argmax(matrix)
max_index = np.argmax(matrix,axis = 0)
#不指定axis時會默認算整個矩陣的最大值索引(不過這個索引是拉平后的,需要是可以先ravel一下),指定后按行或按列求。
min_index = np.argmin(matrix,axis = 0)
print(MAX_index)
print(max_index)
print(min_index)
1
[2 0 2]
[0 2 0]
排序
np.sort() 可指定按行或按列排序。
np.argsort() 可得到排序索引。
# 排序
matrix = np.array([
[15, 50, 10],
[20, 40, 30],
[35, 5, 45]
])
sorted_matrix = np.sort(matrix,axis = 1) #可指定按行或按列排序
print(sorted_matrix)
print(np.argsort(matrix)) #可得到排序索引
[[10 15 50]
[20 30 40]
[ 5 35 45]]
[[2 0 1]
[0 2 1]
[1 0 2]]
擴展矩陣
np.tile(matrix,(n,m)) 將matrix復制n*m倍
#復制擴展矩陣
mat = np.array([
[5, 10],
[15, 20],
])
np.tile(mat,(2,2)) #擴展為原數2*2的矩陣
array([[ 5, 10, 5, 10],
[15, 20, 15, 20],
[ 5, 10, 5, 10],
[15, 20, 15, 20]])
矩陣乘法
A * B 如果是array結構,就是各自對應相乘,如果是矩陣結構,就是矩陣乘法。
A.multiply(A,B) 對應各自相乘。
A.dot(B) = np.dot(A,B) 矩陣乘法。
#矩陣乘法
A = np.array( [[1,0],
[0,1]] )
B = np.array( [[3,3],
[3,3]] )
print("------------------當A,B為array時---------------------")
#當A,B為array時
print("*乘\n",A*B) # 此處對應相乘
print("np.multiply\n",np.multiply(A,B)) #對應相乘
# 以下兩個方法都是矩陣乘法
print("np.dot\n",A.dot(B))
print(np.dot(A, B))
print("------------------當A,B為matrix時---------------------")
#當A,B為matrix時,以下所有乘法都是矩陣乘法
A = np.mat(A)
B = np.mat(B)
print("*乘\n",A*B) #此處矩陣乘法
print("np.multipl\n",np.multiply(A,B)) #對應相乘
print("np.dot\n",A.dot(B))
print(np.dot(A, B))
------------------當A,B為array時---------------------
*乘
[[3 0]
[0 3]]
np.multiply
[[3 0]
[0 3]]
np.dot
[[3 3]
[3 3]]
[[3 3]
[3 3]]
------------------當A,B為matrix時---------------------
*乘
[[3 3]
[3 3]]
np.multipl
[[3 0]
[0 3]]
np.dot
[[3 3]
[3 3]]
[[3 3]
[3 3]]
至此,numpy的學習暫時告一段落,因為我覺得目前實用的一些基本方法都在這里了,以后遇到一些新方法也會加入進來的。這些方法也不用死記硬背,真正需要用到時可以查文檔的。
下一篇開始學習pandas了。