文章目录
- 前言
- 一、广播机制
- 二、数组遍历
- 1.for循环
- 2.nditer函数
- 三、数组操作
- 1.reshape函数
- 2.flat属性
- 3.flatten函数
- 4.revel函数
- 5.数组转置
- 6.升维与降维
- 7.数组的连接与分割
- 8.数组运算
前言
- 通过今天的学习,我进一步掌握了更多numpy的语法知识
一、广播机制
- 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式
- 核心是对形状较小的数组,在维度为1的横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度
a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状: (2, 3)
b = np.array([10, 20, 30]) # 形状: (3,)
c = a + b
print(c)
tips:b是一维数组,可以暂时看做一行三列,通过广播机制变为两行三列即可与a相加
二、数组遍历
1.for循环
- 使用for循环遍历数组的第一维度,可以理解为拆开数组第一层括号的结果
arr = np.array([[1, 2, 3], [4, 5, 6]])
for i in arr:print(i)
2.nditer函数
- nditer函数一般用于遍历多维数组中的每一个元素
- 相较于flat属性可以进行更加复杂的遍历操作,如修改元素,以及指定遍历顺序等等
for i in np.nditer(arr,order="c"):print(i,end=",")
- 使用flags参数指定迭代器额外行为;multi_index: 返回每个元素的多维索引。external_loop: 返回一维数组而不是单个元素
it = np.nditer(arr, flags=['multi_index'])
for x in it:print(f"元素: {x}, 对应索引: {it.multi_index}")
print(" ")
for x in np.nditer(arr, flags=['external_loop'], order='f'):print(x)
三、数组操作
1.reshape函数
- 返回一个新数组,要求与原数组的元素个数保持一致
- 新数组是原数组的视图,对新数组进行修改会直接影响原数组
arr = np.array([1,2,3,4,5,6])
arr_1 = arr.reshape((2,3))
arr_2 = arr.reshape((3,-1)) #-1作为占位符,numpy自动计算
arr_3 = arr.reshape((2,3,1)) #可以理解为分为2个二维数组,每个二维数组是三行一列
2.flat属性
- 与nditer函数有相似的功能,用于行以优先遍历数组元素,返回一个一维迭代器
arr = np.array([1,2,3,4,5,6])
for i in arr.flat:print(i)
print(arr.flat)
3.flatten函数
- 将多维数组转化为一维数组
- 返回的是原数组的深拷贝,修改并不会影响原数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
flat_arr = arr.flatten(order='C') #按行优先顺序展开
print(flat_arr)
flat_arr[-1] = 7
print(arr)
4.revel函数
- 将多维数组转化为一维数组
- 返回的是原数组的视图,修改会直接影响原数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
ravel_arr = arr.ravel() #按行优先顺序展开
print(ravel_arr)
ravel_arr[-1] = 7
print(arr)
5.数组转置
- 在numpy中数组的转置与数学意义上的转置相同,可以使用transpose函数或者T属性
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.transpose(arr))
print(arr.T)
6.升维与降维
- 使用expand_dims和squeeze函数即可对数组进行升维和降维
a = np.array([1, 2, 3])
b = np.expand_dims(a, axis=0) #行方向升维
print(b)
c = np.expand_dims(a, axis=1) #列方向升维
print(c)c = np.array([[[1, 2, 3]]])
d = np.squeeze(c, axis=0)
print(d)
e = np.squeeze(c, axis=1)
print(e)
try:f = np.squeeze(c, axis=2) #指定删除的维度值必须为1,否则将会报错
except:print("error")
g = np.squeeze(c, axis=None) #若为None,则删除数组维度中所有为 1 的项
print(g)
tips:降维要求降低的维度数必须为1,否则报错;如果不指定降维的轴,则会对所有维度为1的轴进行降维
7.数组的连接与分割
- 使用hstack和vstack函数对数组进行垂直,水平拼接
- 要求使用时对应维度的形状相同
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5], [6]])
result = np.hstack((arr1, arr2)) #竖直拼接
print(result)arr1 = np.array([1, 2, 3])
arr2 = np.array([[4, 5, 6],[7,8,9]])
result = np.vstack((arr1, arr2)) #水平拼接
print(result)
- 使用hsplit和vsplit函数对数组进行垂直,水平分割
- 需要指定分割处的索引
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
result = np.hsplit(arr, [1, 3]) #在索引1,3处分割
print(result[2])
result = np.vsplit(arr, [1]) #在索引1处分割
print(result[0])
8.数组运算
- 对于二维数组,np.dot相当于矩阵乘法
- 对于一维数组,np.dot相当于向量点积
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
result = np.dot(a, b)
print(result)
- np.lianlg.det用于求行列式(要求方阵)
a = np.array([[1, 2], [3, 4]],dtype=int)
det_a = np.linalg.det(a) #计算行列式,要求方阵
print(det_a)
THE END