numpy 是 python 的科學計算庫
import numpy as np
1、使用numpy讀取txt檔案
# dtype = "str":指定資料格式 # delimiter = "\t":指定分割符 # skip_header = 1:跳過第一行 npinfo = np.genfromtxt("titanic_train.txt", delimiter = "\t", dtype = "U75", skip_header = 1)
2、ayyay陣列,資料型別是必須相同。
vector = np.array([5, 10, 15, 20]) matrix = np.array([[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]) print(vector) print(matrix)
3、numpy的資料型別,一般用到四種資料型別 bool、 int32/64、 float32/64、 string
print(vector.dtype) print(matrix.dtype)
4、獲取第1行的第4個數
npinfo[0, 3] # 取1-3行和1-3列資料 npinfo[0: 3, 0: 3] # 如果:省略前後數字表示所有資料 npinfo[:, :]
5、判斷array中元素的值
vector == 10
matrix[:, 0] == 25
6、取出等於10的元素
token = (vector == 10)
vector[token]
7、取出有25的這一行
token_25 = (matrix[:, 0] == 25)
matrix[token_25]
8、string 轉 float 型別
vector = np.array(["10", "20", "30", "40"]) vector = vector.astype(float) print(vector)
9、基本運算
vector.sum() # 求和 vector.mean() # 均值 matrix.sum(axis = 0) # 按列求和 matrix.sum(axis = 1) # 按行求和
10、缺失值填補
nan_4 = np.isnan(npinfo[:, 4]) npinfo[nan_4, 4] = 0 # 缺失值填補,對有缺失值的第4列填補0
11、使用 numpy 建立陣列和矩陣
# 建立一個3行5列的矩陣 a = np.arange(15).reshape(3, 5) print(a)
12、檢視當前陣列是幾維的
a.ndim
13、其它檢視
a.dtype
a.size
14、建立一個空矩陣
np.zeros((3, 4))
15、建立一個1矩陣 3維
np.ones((3, 4, 5), dtype = np.int32)
16、建立有步長的矩陣:np.arange( 起始,結束,步長 )
np.arange( 10, 15, 1 )
17、隨機初始化矩陣
np.random.random((3, 4))
18、建立一個指定數量的矩陣
# np.linspace( 起始,結束,數量 ) from numpy import pi np.linspace( 0, 2*pi, 100 )
19、求正弦
np.sin(np.linspace( 0, 2*pi, 100 ))
20、陣列計算
a = np.array([10, 15, 20, 25]) b = np.arange(4) a - b b ** 2 #注意:這個是n次方,不是乘法。 a < 20
21、# 求內積 外積
A = np.array( [[1, 2], [0, 3]] ) B = np.array( [[2, 0], [3, 4]] ) # 內積 對應位置相乘 A * B # 矩陣相乘 A.dot(B) np.dot(A, B)
# 矩陣相乘 原理 #A= #a b c #d e f #g h i #B= #A D #B E #C F #A.dot(B)= #aA+bB+cC aD+bE+cF #dA+eB+fC dD+eE+fF #gA+hB+iC gD+hE+iF
22、e的x次冪
A = np.arange(3)
np.exp(A)
23、開根號
np.sqrt(A)
24、向下取整
C = np.floor(10*np.random.random((3, 4)))
25、轉化為行向量
C.ravel()
26、重新shape,如:由3行4列轉為2行6列
C.shape = (2, 6)
27、行列轉置
C.T
28、其它reshape方法
C.resize((2, 6))
C.reshape(3, -1)
29、矩陣拼接
x = np.floor(10*np.random.random((3, 4))) y = np.floor(10*np.random.random((3, 4))) # 按行拼接 np.vstack((x, y)) # 按列拼接 np.hstack((x, y))
30、矩陣切分
x = np.floor(10*np.random.random((3, 12))) # 按列切成3份 np.hsplit(x, 3) # 如果想切兩刀怎麼辦? np.hsplit(x, (3, 5)) y = np.floor(10*np.random.random((12, 2))) # 按行切分 np.vsplit(y, 3)
31、矩陣相互賦值問題
z = np.arange(12) t = z # 共享記憶體 t is z # 結果是True # print(id(t)) 和 print(id(z)) 的結果是一樣的。 t1 = z.view() #共享資料,但不共享記憶體 t1 is z # 結果是False # print(id(t)) 和 print(id(z)) 的結果是不同的。 t2 = z.copy() #完全是兩個物件
32、排序和索引
data = np.sin(np.arange(20).reshape(5, 4)) # 找最大值 ind = data.argmax(axis = 0) # 最大值的索引 data_max = data[ind, np.arange(data.shape[1])] print(data_max) 不過有最函式:data.max(axis = 0)
33、# 排序
sx = np.floor(10*np.random.random((3, 4))) print(np.sort(sx, axis = 0)) # 按列排序 print(np.sort(sx, axis = 1)) # 按行排序 也可以這麼寫:sx.sort(axis = 1)
34、複製 tile
a = np.arange(0, 40, 10) print(a) # 將a的行復制2倍,列複製3倍 b = np.tile(a, (2, 3)) print(b)
35、8*8棋盤矩陣,其中1、3、5、7行和0、2、4、6列的元素置為1;1 ,3,5,7列和0,2,4,6行也是1
z = np.zeros((8,8), dtype = int) z[1::2,::2] = 1 # 注意:雙冒號的用法 z[::2,1::2] = 1 print(z)
36、多賦值方法
z = np.random.random((10,10))
zmin, zmax = z.min(), z.max()
37、歸一化,將矩陣規格化到0~1,即最小的變成0,最大的變成1,最小與最大之間的等比縮放
z = 10*np.random.random((5,5)) zmin, zmax = z.min(), z.max() z = (z-zmin)/(zmax-zmin) #歸一化公式 print(z)
38、矩陣相加
z = np.zeros((5,5)) z += np.arange(5) print(z)
39、生成0~10之間均勻分佈的11個數,包括0和10
z = np.linspace(0, 10, 11, endpoint=True, retstep=True) print(z)
40、交換矩陣的其中兩行
a = np.arange(25).reshape(5,5) a[[0,1]] = a[[1,0]] print(a)
41、找出陣列中與給定值最接近的數
z = np.array([[0,1,2,3],[4,5,6,7]]) a = 5.1 print(np.abs(z-a).argmin())
42、判斷二維矩陣中有沒有一整列數為0?
z = np.random.randint(0,3,(2,10)) print(z.any(axis = 0))
43、生成二維的高斯矩陣
x,y = np.meshgrid(np.linspace(-1,1,10),np.linspace(-1,1,10)) D = np.sqrt(x**2 + y**2) sigma, mu = 1, 0 a = np.exp(-(D-mu)**2 / (2*sigma**2)) print(a)