Numpy
NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。Numpy许多底层函数实际上是用C编写的,因此它的矩阵向量计算速度是原生Python中无法比拟的。
numpy属性
维度(ndim)
# 创建二维数组
array = np.array([
[1,2,3],
[4,5,6],
[7,8,9]
])
print(array.ndim)
# 2
形状(shape)
print(array.shape)
# (3,3)
大小(size)
print(array.size)
# 9
数据类型(dtype)
print(array.dtype)
# int32
创建array
a = np.array([1,2,3],dtype=np.float) # 创建一维数组,dtype指定元素类型
print(a.dtype)
# float64
d = np.array([ # 创建二维数组
[2,3,4],
[4,5,6],
[6,7,8]
])
print(d)
#[[2 3 4]
# [4 5 6]
# [6 7 8]]
生成array
zero = np.zeros((2,3)) # 生成2行3列全为0的矩阵
print(zero)
#[[0. 0. 0.]
# [0. 0. 0.]]
one = np.ones((3,4)) # 生成3行4列全为1的矩阵
print(one)
#[[1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]]
empty = np.empty((3,2)) # 生成3行2列全都接近于0(不等于0)的矩阵
print(empty)
#[[0. 0.]
# [0. 0.]
# [0. 0.]]
e = np.arange(10)
print(e)
# [0 1 2 3 4 5 6 7 8 9]
f = np.arange(4,12)
print(f)
# [ 4 5 6 7 8 9 10 11]
g = np.arange(1,20,3) # 步距3
print(g)
# [ 1 4 7 10 13 16 19]
h = np.arange(8).reshape(2,4) # 重新定义矩阵的形状
print(h)
#[[0 1 2 3]
# [4 5 6 7]]
arr3 = arr1 > 3 # 将判断结果存入arr3
print(arr3)
#[[False False False]
# [ True True True]]
print(arr1.T) # 矩阵转置
print(np.transpose(arr1)) # 矩阵转置
矩阵运算
以下运算都是两矩阵形状一致才能进行,因为都是对应位置上的元素逐一运算。
加法运算
arr1 = np.array([
[1,2,3],
[4,5,6]
])
arr2 = np.array([
[1,1,2],
[2,3,4]
])
print(arr1 + arr2)
#[[ 2 3 5]
# [ 6 8 10]]
减法运算
print(arr1 - arr2)
#[[0 1 1]
# [2 2 2]]
乘法运算
print(arr1 * arr2)
#[[ 1 2 6]
# [ 8 15 24]]
# 两矩阵相乘
np.dot(arr1,arr2)
arr1.dot(arr2)
除法运算
print(arr1 / arr2)
#[[1. 2. 1.5 ]
# [2. 1.66666667 1.5 ]]
幂运算
print(arr1 ** arr2)
#[[ 1 2 9]
# [ 16 125 1296]]
取余运算
print(arr1 % arr2)
#[[0 0 1]
# [0 2 2]]
取整运算
print(arr1 // arr2)
#[[1 2 1]
# [2 1 1]]
随机数生成及矩阵运算
sample1 = np.random.random((3,2)) # 生成3行2列从0到1的随机数
print(sample1)
# [[0.23880087 0.36963104]
# [0.12920673 0.19140641]
# [0.29037101 0.41021395]]
sample2 = np.random.normal(loc=0,scale=1,size=(3,2)) # 生成3行2列符合标准正态分布的随机数
print(sample2)
#[[ 0.12024487 -0.71771871]
# [ 1.18751981 0.55059626]
# [-0.36288479 0.48795296]]
sample3 = np.random.randint(0,10,size=(3,2)) # 生成3行2列从0到10的随机整数
print(sample3)
#[[9 8]
# [4 2]
# [8 9]]
np.sum(sample3) # 矩阵所有元素求和
np.sum(sample3,axis=0) # axis=0表示对列求和
np.sum(sample3,axis=1) # axis=1表示对行求和
# 40
# array([21, 19])
# array([17, 6, 17])
np.min(sample3) # 矩阵元素最小值
np.argmin(sample3) # 求最小值的索引
# 2
# 3
np.max(sample3) # 矩阵元素最大值
np.argmax(sample3) # 求最大值的索引
# 9
# 0
np.mean(sample3) # 求平均值
# 6.666666666666667
np.median(sample3) # 取中位数
# 8.0
np.sqrt(sample3) # 元素逐一开方
# array([[3. , 2.82842712],
# [2. , 1.41421356],
# [2.82842712, 3. ]])
排序
sample4 = np.random.randint(0,10,size=(1,10))
print(sample4)
# [[0 9 4 4 1 1 4 3 2 9]]
print(np.sort(sample4)) # 对数组排序
# [[0 1 1 2 3 4 4 4 9 9]]
sample3 = [
[9 8],
[4 2],
[8 9]
]
print(np.sort(sample3,axis=0)) # 列排序
print(np.sort(sample3,axis=1)) # 行排序
print(np.sort(sample3,axis=None)) # axis=None,先进行扁平化处理,再排序
#[[4 2]
# [8 8]
# [9 9]]
#[[8 9]
# [2 4]
# [8 9]]
#[2 4 8 8 9 9]
限定矩阵元素范围
np.clip(sample3,a_min=3,a_max=6) # 限定sample中的元素范围,小于a_min的变为a_min,大于a_mxa的变为a_max
#array([[6, 6],
# [4, 3],
# [6, 6]])
numpy索引
arr1 = np.arange(2,14)
print(arr1)
# [ 2 3 4 5 6 7 8 9 10 11 12 13]
print(arr1[2]) # 索引从0开始
# 4
print(arr1[1:4]) # 切片,索引从1开始到4(不含4)
# [3 4 5]
print(arr1[2:-1]) # 索引从2到倒数第1个位置(不含倒数第1)
# [ 4 5 6 7 8 9 10 11 12]
print(arr1[:5]) # 从开始取到索引5(不含5)
# [2 3 4 5 6]
print(arr1[-2:]) # 索引倒数第2到最后
# [12 13]
arr2 = arr1.reshape(3,4)
print(arr2)
#[[ 2 3 4 5]
# [ 6 7 8 9]
# [10 11 12 13]]
print(arr2[1])
print(arr2[1][2])
print(arr2[1,2]) # 等价于arr2[1][2]
#[6 7 8 9]
#8
#8
print(arr2[:,2]) # 取所有行第2列
# [ 4 8 12]
for i in arr2: # 迭代行
print(i)
# [2 3 4 5]
# [6 7 8 9]
# [10 11 12 13]
for i in arr2.T: # 迭代列
print(i)
# [ 2 6 10]
# [ 3 7 11]
# [ 4 8 12]
# [ 5 9 13]
for i in arr2.flat: # 扁平化
print(i)
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# 11
# 12
# 13
array的合并
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr3 = np.vstack((arr1,arr2)) # 垂直合并
print(arr3,arr3.shape)
# [[1 2 3]
# [4 5 6]] (2, 3)
arr4 = np.hstack((arr1,arr2)) # 水平合并
print(arr4,arr4.shape)
# [1 2 3 4 5 6] (6,)
arrv = np.vstack((arr1,arr2,arr3)) # 多个矩阵合并
print(arrv,arrv.shape)
# [[1 2 3]
# [4 5 6]
# [1 2 3]
# [4 5 6]] (4, 3)
concatenate矩阵合并
concatenate必须同维数组才能合并。
arr5 = np.concatenate((arr3,[arr1]),axis=0) # concatenate必须同维数组才能合并,arr1是一维,只能加个[]转为二维才能合并
print(arr5) # axis = 0 垂直合并
# [[1 2 3]
# [4 5 6]
# [1 2 3]]
arr6 = np.concatenate((arr3,[[1],[2]]),axis=1) #水平合并
print(arr6) # axis = 1 水平合并
# [[1 2 3 1]
# [4 5 6 2]]
arr10 = np.atleast_2d(arr1) # 将矩阵变为至少二维矩阵,大于2不生效
print(arr10)
# [[1 2 3]]
array分割
arr1 = np.arange(12).reshape((3,4))
print(arr1)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
arr2,arr3 = np.split(arr1,2,axis=1) # 水平方向分割,分成2分
print(arr2)
print(arr3)
#[[0 1]
# [4 5]
# [8 9]]
#[[ 2 3]
# [ 6 7]
# [10 11]]
arr4,arr5,arr6 = np.split(arr1,3,axis=0) # 垂直方向分割,分成2分
print(arr4)
print(arr5)
print(arr6)
# [[0 1 2 3]]
# [[4 5 6 7]]
# [[ 8 9 10 11]]
array拷贝
arr1 = np.array([1,2,3])
# 浅拷贝
arr2 = arr1 # 不同指针,指向同一块内存,浅拷贝
arr2[0] = 5
print(arr1)
print(arr2)
# [5 2 3]
# [5 2 3]
# 深拷贝
arr3 = arr1.copy() # 深拷贝,重新开辟内存空间
arr3[0] = 10
print(arr1)
print(arr3)
# [5 2 3]
# [10 2 3]