本笔记摘录清华大学工业工程系朱成礼老师的python教案与授课内容,并在此基础上进行实操性的拓展,希望能对大家有所帮助。
一、ndarray多维数组
1、ndarray是numpy中的多维数组
import numpy as np
a = np.array([[0,1,2,3],[1,2,3,4],[2,3,4,5]])
print(a)
2、ndarray内部结构
要求ndarray中所有元素必须是同类元素,在内存中是一块连续的存储空间(Memory Block),另一个对象存储对数据的解释(Data Structure) 。ndarray切片后产生新的data structure,memory block不变;List切片后没有视图,所以就相当于copy了一个副本,产生了一个新的List 。
3、ndarray对象的常用属性
一点想法:在使用时,应注意区分是numpy后的属性函数还是ndarray后面的属性函数。若是numpy所拥有的函数应该使用numpy.+函数名;若是ndarray后面的属性函数,则应使用“数组名.+函数名”
二、ndarray的创建方法
1、基础功能
# 创建一ndarray
import numpy as np
a = np.array(object) # object是生成数组的数据序列[[list1],[list2]....]
print(a.dtype)
print(a.shape)
b = np.arange([start,]stop[,step]) # arange支持小数步长
c = np.linspace(start, stop, num = 50) # num指定等差数列的数据个数,stop的元素也包括在内
d = np.ones(shape=(5,3)) # 创建一个5*3的全是1的数组
e = np.ones_like(a) # 创建一个和a形状一样,全是1的数组
# zero zero_like同理
eye();identity(n);full(shape,num)
2、示例
# 用array()创建ndarray数组
import numpy as np # 导入numpy扩展库
a = np.array([[1, 2, 3], [2, 6, 4], [8, 4, 5]])
print(a)
print(a.ndim) # 输出数组的秩
print(a.shape) # 输出数组的形状
print(a.T) # 输出数组的转置
print(a.dtype) # 输出数组的数据类型
print(a.size) # 输出数组的元素数
# 用arange()创建ndarray数组
b = np.arange(1, 7, 0.5)
print(b.dtype) # 输出数组的数据类型
print(b.shape) # 输出数组形状
# 用linspace输出一个有三十个元素的数组,数据类型为float
c = np.linspace(3.1, 5.7, 30)
print(c.dtype)
# 创建一个4*5 全部值都是6的数组
d = np.full(shape=(4, 5), fill_value=6)
print(d)
三、numpy数组元素操作
简要总结什么时候前缀是numpy什么时候前缀是数组名:
前缀是numpy的情况:创建一个数组、特殊元素过滤、数组的正常运算和线性代数运算\数组元素的筛选
前缀是数组名的情况:数组索引、数组切片、改变数组形状、数组的统计学运算、数组内元素的排序
1、数组索引
首先,索引和切片不同,他总是将索引元素复制到新数组中。
索引从零开始,有以下三种索引方式
1.5、特殊元素过滤
# 特殊元素过滤
import numpy as np
a = np.array([[np.nan,1,2],[np.nan,3,4]])
b = np.array([1,2+6j,5,3.5+5j])
print(a)
print(b)
# 使用了~()取补运算符来过滤NaN
print(a[~np.isnan(a)])
# 从数组中过滤掉非复数元素
print(b[np.iscomplex(b)])
2、数组切片
示例:
# 用linspace函数,在啊【0,20)生成30个等差一维数组,
# 并将数组形状变换为10行,3列的二维数组arr_1
import numpy as np
a = np.linspace(0, 20, 30)
arr_1 = a.reshape(10, 3)
print(arr_1)
# 获取由arr_1第五行到第七行,第一列到第三列的元素构成的3*3二维数组切片
arr_2 = arr_1[4:7, 0:3]
print(arr_2)
# 获取由arr_1偶数行、第1到2列元素构成的一个二维数组切片:arr_3
arr_3 = arr_1[0::2, 0:2]
print(arr_3)
# 获取arr_1中大于10的元素构成的数组:arr_4
arr_4 = arr_1[arr_1 > 10]
print(arr_4)
# 获取arr_1由列表[3,6,9]索引获得的行,第2到3列组成的数组:arr_5
m = [3,6,9]
arr_5 = arr_1[m, 1:3]
print(arr_5)
一定要注意区分切片与索引二者的区别:索引是,你可以找到数中的某一行或某一列元素,并对其进行修改,修改后的结果返回一个新数组;而切片是你选择某一块元素后,若将其进行修改后输出,只输出修改的部分,数组中的其他未修改的部分不输出,在此同时,原数组没有发生改变。
ep: arr_1[:, 0]是索引找到第一列;而arr_1[, 0:]是切片切出第一列
3、改变数组形状
四、数组的运算
1、数组的算术运算与运算函数
算术运算的加减乘除是对应元素之间的加减乘除。
2、ndarray数组线性代数运算
# 已知一个矩阵A,求A的逆,求A的行列式的值,再求A逆B
# 写入这个矩阵A
import numpy as np
A = np.array([[1,2,1],[2,-1,3],[3,1,2]])
print(f'矩阵A为:{A}')
inverseA = np.linalg.inv(A) # 求A的逆
print(f'矩阵A的逆为:{inverseA}')
deterA = np.linalg.det(A) # 求A的行列式的值
print(f'矩阵A的行列式的值为:{deterA}')
# 写入向量b
b = np.array([[7],[7],[18]])
print(f'向量b为:{b}')
sol = np.dot(inverseA,b) # 计算A逆b
print(f'计算A的逆乘b的结果为:{sol}')
# 解方程Ax=b
x = np.linalg.solve(A,b)
print(f'Ax=b方程的解为:{x}')
3、ndarray常用统计函数
# 使用numpy为多维数组进行统计计算
# 创建ndarray数组
import numpy as np
array_a = np.array([[8, 3, 2, 5], [6, 22, 15, 8], [36, 16, 20, 31]])
print(array_a)
# 计算每列的最大值和均值
line_max = array_a.max(axis=0)
print(f'每列的最大值为:{line_max}')
mean = array_a.mean(axis=0)
print(f'每列的均值为:{mean}')
# 按第二列的数值大小,对行进行排序
sorted_idx = array_a[:, 1].argsort()
result = array_a[sorted_idx]
print(f'按第二列的数值大小进行排序为:{result}')
# 筛选出大于20的元素
x = np.where(array_a > 20)
print(f'数组中大于20的元素为:{array_a[x]}')
4、ndarray元素的排序和筛选
4.1 ndarray.sort()与ndarray.argsort()函数排序对比
相同点:括号内都是这样的格式(axis= ,kind='quicksort', order=None)# order:如果数组包含字段,则这里是要排序的字段
axis = 0 # 按列排序;axis = 1 # 按行排序;axis = -1 # 默认沿着最里层排序
不同点:sort()排序是原地对数组进行排序,排序后改变了原数组,没有返回值;而argsort()排序是返回对数组进行排序后元素在原数组中的索引,也就是说,需要
sorted_idx = x[:,2].argsort()
y = x[sorted_idx]
print(y)才能得到排序后的整个数组的结果(注意这里[:,2]用的是索引哦~)
4.2 numpy.where()筛选函数
where函数也相当于生成了一个索引。
五、随机数生成方法(使用numpy.random模块)
ps:随手记录一下 ./当前路径
../表示当前路径的父目录
1、简单随机数
1.1 简单随机数的生成方法
import numpy as np
a = np.random.rand(d0,d1,...dn) # 生成一个随机数组,元素取自[0,1)上的均匀分布
b = np.random.randn(d1,d2,d3,...dn) # 生成一个数组,元素是标准正态分布随机数,若没有参数,则返回单个数据
c = np.random.randint(m,n,size) # 生成m,n范围的数组,形状为size(传入元组形式的shape)ep:传入一个(1,2)
1.2 随机抽取元素
2、随机分布
3、随机排列
六、读写文件
numpy的使用过程相对枯燥,但他却是许多其他的库使用的基石,因此学好numpy库也是十分必要的!