Numpy是用于科學計算的python包。
一、建立numpy數組(array)
A numpy array or ND array 與python資料結構中的清單(list)非常相似,不過numpy array一般大小固定,且其中每個元素的類型相同,比如都是整數型、都是浮點型。
建立numpy array時,需要先import numpy。numpy array的資料類型是numpy.ndarray.(不是list哦!)
(一)建立一維數組(array)
import numpy as np
a = np.array([0,1,2,3,4])
type(a)
#numpy.ndarray
a.dtype
#dtype('int32')
如果array裡有一個元素是文字,則所有元素都會變成文字類型
一些常用的查詢array屬性的方法:
- a.dtype: 傳回array的資料類型
- a.size:傳回array中元素的個數
- a.shape:傳回每個次元下的元素個數,元組(tuple)形式
- a.ndim:傳回array的次元,一維數組為1,二維數組為2, n維數組為n
a = np.array([0,1,2,3,4])
a.dtype # dtype('int32')
a.size # 5
a.shape # (5,)
a.ndim # 1
(二)建立多元數組(array)
#二維數組
a = [[1,2,3],[4,5,6],[7,8,9]]
A = np.array(a)
# A = |1,2,3|
# |4,5,6|
# |7,8,9|
#A是一個二維數組。
A.ndim
# 2
# 可以認為A.ndim表示有多少層括号
A.shape
#(3,3)
#A.shape反應了每層括号裡所包含的元素個數,即每個次元下的元素個數。
#比如A有3行(第一層括号有3個元素)和3列(每個第二層括号裡都有3個元素)
A.size
# 9
# A.size傳回整個數組的元素個數,比如A中一共有3*3=9個元素。
二、index and slice
(一)一維數組index和slicing
1. Index和修改資料
2. Slicing和修改資料
利用切片一次性修改多個資料的時候,新資料指派時不用加方括号!
3. 用清單list選擇和修改array中元素的值
下圖中清單select給出了從array選擇的元素的index,c是被選擇的array, d是選擇後的array
(二)二維數組(矩陣)index和slicing
1. Index
矩陣名[行數,列數] 或者 矩陣名[行數][列數]
#擷取下圖矩陣A的第二行、第三列資料
#注意行、列均從0開始編号
A[1,2]
#結果: 23
A[1][2]
#結果:23
#擷取下圖矩陣A的第一行、第一列資料
#注意行、列均從0開始編号
A[0][0]
#結果: 11
2. Slicing
矩陣名[行數範圍,列數範圍] 或者 矩陣名[行數範圍][列數範圍]
傳回值是array結構
#擷取矩陣A的第1行、第1-2列的資料
A[0][0:2]
#結果
#array([11, 12])
#擷取矩陣A的第1-2行、第3列的資料
A[0:2][2]
#結果
#array([13, 23])
注意:A[0:2][0:2] 與A[0:2,0:2]擷取的資料差別
A[0:2,0:2]
#結果
#array([[11, 12],
# [21, 22]])
#擷取矩陣A的第1-2行、第1-2列的資料
A[0:2][0:2]
#結果
#array([[11, 12, 13],
# [21, 22, 23]])
#相當于先擷取矩陣A的第1-2行資料(矩陣A_1),再擷取A'的第1-2行資料,即
#A_1 = A[0:2]
#A[0:2][0:2] = A_1[0:2]
如果想擷取矩陣A第1-2列資料的第2-3行資料:
#最直接
A[1:3,0:2]
#結果
#array([[21, 22],
# [31, 32]])
#如果想行列拆開寫,先擷取第2-3行全部資料,然後從中擷取第1-2列的資料
A[1:3][:,0:2]
#結果
#array([[21, 22],
# [31, 32]])
#或者,先擷取第1-2列全部資料,然後從中擷取第2-3行的資料
A[:,0:2][1:3]
#結果
#array([[21, 22],
# [31, 32]])
三、基礎算法 - 一維數組(向量)
(一)向量(vector)加減
不使用numpy的時候,需要用loop将每對元素相加
#将兩個向量u和v相加,不使用numpy
u = [0,1]
v = [1,3]
z = []
for n, m in zip(u,v):
z.append(n+m)
#【結果】
# z = [1,4]
如果使用numpy,計算速度會更快
#将兩個向量u和v相加,使用numpy
import numpy as np
u = np.array([0,1])
v = np.array([1,3])
z = u+v
#【結果】
# z = [1,4]
也可以進行向量減法、向量與常數相乘、向量與常數相加
z = u-v
#【結果】
# z = [-1,-2]
z1 = z*2
#【結果】
# z = [-2,-4]
z2 = z + 2
#【結果】
# z = [1,0]
還可以進行向量乘法(結果為一個向量)、向量點積(結果為一個數值)
u = [1,2]
v = [3,4]
z = u*v
#【結果】
# z = [1*3+1*4,2*3+2*4] = [7,14]
z1 = np.dot(u,v)
#【結果】
# z1 = 1*3+2*4 = 11
需要注意,向量乘法不滿足交換律,即u * v != v * u
z2 = v*u
#【結果】
# z2 = [3*1+3*2,4*1+4*2] = [9,12]
四、通用功能 - 一維數組
- 最小值、最大值、标準差、平均值等,min(), max(), std(), mean()
a = np.array([1,-2,3,4])
#求平均
mean_a = a.mean()
# mean_a = (1-2+3+4)/4 = 1.5
#找最大值
max_a = a.max()
#max_a = 4
min_a = a.min()
#min_a = -2
std_a = a.std()
#std_a = 2.29128784747792
- np.pi & .sin()
# np.pi是圓周率,求sin()
x = np.array([0, np.pi/2, np.pi])
y = np.sin(x)
#y = [sin(0), sin(np.pi/2), sin(np.pi)] = [0, 1, 0]
- np.linespace(start point, end point, 元素個數):建立均勻分布的數列
x = np.linespace(-2, 2, num = 5)
#x = [-2, -1, 0, 1, 2]
y = np.linespace(-2, 2, num = 9)
#y = [-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2]
五、基礎算法–二維數組(矩陣)
1. 矩陣加法、與常量相乘、Hadamard乘積(按元素相乘)
- 矩陣加法
x = np.array([[1,0],[0,1]])
y = np.array([[2,1],[1,2]])
z = x+y
# z: array([[3,1],[1,3]])
- 矩陣與常數相乘
z1 = 2*y
# z1: array([[4,2],[2,4]])
- 矩陣Hadamard乘積(即矩陣各元素相乘)
z2 = x*y
#z2: array([[1*2,0*1],[0*1,1*2]]) = array([[2,0],[0,2]])
2. 矩陣乘法
x = np.array([[0,1,1],[1,0,1]])
y = np.array([[1,1],[1,1],[-1,1]])
#矩陣乘法的時候,需要保證前面矩陣的行數與後面矩陣的列數相等。
z = np.dot(x,y)
# z: array([[0*1+1*1+1*-1,0*1+1*1+1*1],[1*1+0*1+1*-1,1*1+0*1+1*1]]) ---> array([[0,2],[0,2]])
3. 矩陣轉置
C = np.array([[1,1],[2,2],[3,3]])
C
#array([[1, 1],
# [2, 2],
# [3, 3]])
C.T
#array([[1, 2, 3],
# [1, 2, 3]])
4. 其他
- np.sin() : 對矩陣中各個元素分别求sin值
Z = np.array([[0,2],[0,2]])
np.sin(Z)
#結果
#array([[0. , 0.90929743],
# [0. , 0.90929743]])