NumPy矩阵与通用函数及统计分析案例
- NumPy矩阵与通用函数及统计分析
- 一、掌握NumPy矩阵与通用函数
- 代码 2 - 30:矩阵的创建
- 代码 2 - 31:数组的创建与组合
- 代码 2 - 32:矩阵的运算
- 代码 2 - 33:矩阵的转置、逆矩阵和二维数组视图
- 代码 2 - 34:数组的基本运算
- 代码 2 - 35:数组的比较运算
- 代码 2 - 36:数组的逻辑运算
- 代码 2 - 37:数组的广播相加(一维数组加到二维数组)
- 代码 2 - 38:数组的广播相加(一维数组加到二维数组的不同维度)
- 二、利用NumPy进行统计分析
- 代码 2 - 39:数组的保存(单个数组)
- 代码 2 - 40:数组的保存(多个数组)
- 代码 2 - 41:数组的读取(单个数组和多个数组)
- 代码 2 - 42:数组的保存和读取(文本格式)
- 代码 2 - 43:数组的读取(文本格式,使用genfromtxt)
- 代码 2 - 44:数组的排序
- 代码 2 - 45:返回排序后的索引
- 代码 2 - 46:多个键值排序
- 代码 2 - 47:数组的去重
- 代码 2 - 48:数组的重复(使用tile)
- 代码 2 - 49:数组的重复(使用repeat)
- 代码 2 - 50:数组的统计计算
- 代码 2 - 51:数组的累计和与累计积
NumPy矩阵与通用函数及统计分析
一、掌握NumPy矩阵与通用函数
代码 2 - 30:矩阵的创建
python">import numpy as np # 导入NumPy库
matr1 = np.mat('1 2 3; 4 5 6; 7 8 9') # 使用分号隔开数据
print('创建的矩阵为:\n', matr1)
matr2 = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('创建的矩阵为:\n', matr2)
代码解析:
这段代码主要展示了两种创建矩阵的方法。np.mat
函数可以通过字符串形式创建矩阵,字符串中用分号隔开不同的行;np.matrix
函数则可以通过嵌套列表的形式创建矩阵。
代码 2 - 31:数组的创建与组合
python">arr1 = np.eye(3)
print('创建的数组1为:\n', arr1)
arr2 = 3 * arr1
print('创建的数组2为:\n', arr2)
print('创建的矩阵为:\n', np.bmat('arr1 arr2; arr1 arr2'))
代码解析:
np.eye(3)
创建了一个3x3的单位矩阵arr1
,然后将arr1
乘以3得到arr2
。np.bmat
函数用于从数组、矩阵或字符串构建一个大矩阵,这里将arr1
和arr2
组合成一个更大的矩阵。
代码 2 - 32:矩阵的运算
python">matr1 = np.mat('1 2 3; 4 5 6; 7 8 9') # 创建矩阵
print('创建的矩阵为:\n', matr1)
matr2 = matr1 * 3 # 矩阵与数相乘
print('创建的矩阵为:\n', matr2)
print('矩阵相加结果为:\n', matr1 + matr2) # 矩阵相加
print('矩阵相减结果为:\n', matr1 - matr2) # 矩阵相减
print('矩阵相乘结果为:\n', matr1 * matr2) # 矩阵相乘
print('矩阵对应元素相乘结果为:\n', np.multiply(matr1, matr2))
代码解析:
首先创建了矩阵matr1
,然后将其乘以3得到matr2
。接着展示了矩阵的加法、减法、乘法运算,以及对应元素相乘的运算,其中矩阵相乘使用*
运算符,对应元素相乘使用np.multiply
函数。
代码 2 - 33:矩阵的转置、逆矩阵和二维数组视图
python">matr3 = np.mat([[6, 2, 1], [1, 5, 2], [3, 4, 8]])
print('矩阵转置结果为:\n', matr3.T) # 转置
print('矩阵的逆矩阵结果为:\n', matr3.I) # 逆矩阵
print('矩阵的二维数组结果为:\n', matr3.A) # 返回二维数组的视图
代码解析:
创建矩阵matr3
,通过.T
属性获取矩阵的转置,通过.I
属性获取矩阵的逆矩阵,通过.A
属性获取矩阵的二维数组视图。
代码 2 - 34:数组的基本运算
python">x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print('数组相加结果为:', x + y) # 数组相加
print('数组相减结果为:', x - y) # 数组相减
print('数组相乘结果为:', x * y) # 数组相乘
print('数组相除结果为:', x / y) # 数组相除
print('数组幂运算结果为:', x ** y) # 数组幂运算
代码解析:
创建两个数组x
和y
,然后分别进行数组的加法、减法、乘法、除法和幂运算,这些运算都是对应元素之间的运算。
代码 2 - 35:数组的比较运算
python">x = np.array([1, 3, 5])
y = np.array([2, 3, 4])
print('数组比较结果为:', x < y)
print('数组比较结果为:', x > y)
print('数组比较结果为:', x == y)
print('数组比较结果为:', x >= y)
print('数组比较结果为:', x <= y)
print('数组比较结果为:', x != y)
代码解析:
创建两个数组x
和y
,然后进行各种比较运算,返回的是布尔数组,表示对应元素的比较结果。
代码 2 - 36:数组的逻辑运算
python">print('数组逻辑运算结果为:', np.all(x == y)) # np.all表示逻辑and
print('数组逻辑运算结果为:', np.any(x == y)) # np.any表示逻辑or
代码解析:
np.all
函数用于判断数组中所有元素是否都满足某个条件,np.any
函数用于判断数组中是否有任何元素满足某个条件,这里判断x
和y
对应元素是否相等。
代码 2 - 37:数组的广播相加(一维数组加到二维数组)
python">arr1 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
print('创建的数组1为:\n', arr1)
print('数组1的shape为:', arr1.shape)
arr2 = np.array([1, 2, 3])
print('创建的数组2为:', arr2)
print('数组2的shape为:', arr2.shape)
print('数组相加结果为:\n', arr1 + arr2)
代码解析:
创建二维数组arr1
和一维数组arr2
,由于NumPy的广播机制,一维数组arr2
会自动扩展到与arr1
相同的形状,然后进行元素相加。
代码 2 - 38:数组的广播相加(一维数组加到二维数组的不同维度)
python">arr1 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
print('创建的数组1为:\n', arr1)
print('数组1的shape为:', arr1.shape)
arr2 = np.array([1, 2, 3, 4]).reshape((4, 1))
print('创建的数组2为:\n', arr2)
print('数组2的shape为:', arr2.shape)
print('数组相加结果为:\n', arr1 + arr2)
代码解析:
创建二维数组arr1
和一维数组arr2
,将arr2
通过reshape
方法转换为二维数组,然后由于广播机制,arr2
会在列方向上扩展到与arr1
相同的形状,再进行元素相加。
二、利用NumPy进行统计分析
代码 2 - 39:数组的保存(单个数组)
python">import numpy as np # 导入NumPy库
arr = np.arange(100).reshape(10, 10) # 创建一个数组
np.save('../tmp/save_arr', arr) # 保存数组
print('保存的数组为:\n', arr)
代码解析:
创建一个10x10的数组arr
,然后使用np.save
函数将数组保存到指定文件中。
代码 2 - 40:数组的保存(多个数组)
python">arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.arange(0, 1.0, 0.1)
np.savez('../tmp/savez_arr', arr1, arr2)
print('保存的数组1为:', arr1)
print('保存的数组2为:', arr2)
代码解析:
创建两个数组arr1
和arr2
,然后使用np.savez
函数将多个数组保存到一个文件中。
代码 2 - 41:数组的读取(单个数组和多个数组)
python"># 读取含有单个数组的文件
loaded_data = np.load('../tmp/save_arr.npy')
print('读取的数组为:\n', loaded_data)
# 读取含有多个数组的文件
loaded_data1 = np.load('../tmp/savez_arr.npz')
print('读取的数组1为:\n', loaded_data1['arr_0'])
print('读取的数组2为:', loaded_data1['arr_1'])
代码解析:
使用np.load
函数读取保存的数组文件,对于单个数组文件,直接读取即可;对于多个数组文件,读取后可以通过数组名(如arr_0
、arr_1
)来访问不同的数组。
代码 2 - 42:数组的保存和读取(文本格式)
python">arr = np.arange(0, 12, 0.5).reshape(4, -1)
print('创建的数组为:\n', arr)
# fmt='%d'表示保存为整数
np.savetxt('../tmp/arr.txt', arr, fmt='%d', delimiter=',')
# 读入的时候也需要指定逗号分隔
loaded_data = np.loadtxt('../tmp/arr.txt', delimiter=',')
print('读取的数组为:\n', loaded_data)
代码解析:
创建一个数组arr
,使用np.savetxt
函数将数组保存为文本文件,指定保存格式为整数,分隔符为逗号。读取时使用np.loadtxt
函数,同样指定分隔符为逗号。
代码 2 - 43:数组的读取(文本格式,使用genfromtxt)
python">loaded_data = np.genfromtxt('../tmp/arr.txt', delimiter=',')
print('读取的数组为:\n', loaded_data)
代码解析:
使用np.genfromtxt
函数从文本文件中读取数组,同样指定分隔符为逗号。
代码 2 - 44:数组的排序
python">np.random.seed(42) # 设置随机种子
arr = np.random.randint(1, 10, size=10) # 生成随机数组
print('创建的数组为:', arr)
arr.sort() # 直接排序
print('排序后数组为:', arr)
np.random.seed(42) # 设置随机种子
arr = np.random.randint(1, 10, size=(3, 3)) # 生成3行3列的随机数组
print('创建的数组为:\n', arr)
arr.sort(axis=1) # 沿着横轴排序
print('排序后数组为:\n', arr)
arr.sort(axis=0) # 沿着纵轴排序
print('排序后数组为:\n', arr)
代码解析:
首先生成一个一维随机数组并进行排序,然后生成一个二维随机数组,分别沿着横轴(axis=1
)和纵轴(axis=0
)进行排序。
代码 2 - 45:返回排序后的索引
python">arr = np.array([2, 3 , 6, 8, 0, 7])
print('创建的数组为:', arr)
print('排序后数组为:', arr.argsort()) # 返回值为重新排序值的下标
代码解析:
创建一个数组arr
,使用argsort
方法返回排序后的元素索引。
代码 2 - 46:多个键值排序
python">a = np.array([3, 2, 6, 4, 5])
b = np.array([50, 30, 40, 20, 10])
c = np.array([400, 300, 600, 100, 200])
d = np.lexsort((a, b, c)) # lexsort函数只接受一个参数,即(a,b,c)
# 多个键值排序是按照最后一个传入数据计算的
print('排序后数组为:\n', list(zip(a[d], b[d], c[d])))
代码解析:
创建三个数组a
、b
、c
,使用np.lexsort
函数进行多个键值排序,按照最后一个传入的数组c
进行排序,最后将排序后的数组元素打包输出。
代码 2 - 47:数组的去重
python">names = np.array(['小明', '小黄', '小花', '小明',
'小花', '小兰', '小白'])
print('创建的数组为:', names)
print('去重后的数组为:', np.unique(names))
# 跟np.unique函数等价的Python代码实现过程
print('去重后的数组为:', sorted(set(names)))
# 创建数值型数据
ints = np.array([1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10])
print('创建的数组为:', ints)
print('去重后的数组为:', np.unique(ints))
代码解析:
创建一个字符串数组names
和一个数值数组ints
,使用np.unique
函数对数组进行去重,同时展示了使用Python的set
和sorted
函数实现去重的方法。
代码 2 - 48:数组的重复(使用tile)
python">arr = np.arange(5)
print('创建的数组为:', arr)
print('重复后数组为:', np.tile(arr, 3)) # 对数组进行重复
代码解析:
创建一个数组arr
,使用np.tile
函数将数组重复3次。
代码 2 - 49:数组的重复(使用repeat)
python">np.random.seed(42) # 设置随机种子
arr = np.random.randint(0, 10,size=(3, 3))
print('创建的数组为:\n', arr)
print('重复后数组为:\n', arr.repeat(2, axis=0)) # 按行进行元素重复
print('重复后数组为:\n', arr.repeat(2, axis=1)) # 按列进行元素重复
代码解析:
创建一个二维随机数组arr
,使用repeat
方法按行(axis=0
)和按列(axis=1
)分别将元素重复2次。
代码 2 - 50:数组的统计计算
python">arr = np.arange(20).reshape(4, 5)
print('创建的数组为:\n', arr)
print('数组的和为:', np.sum(arr)) # 计算数组的和
print('数组横轴的和为:', arr.sum(axis=0)) # 沿着横轴计算求和
print('数组纵轴的和为:', arr.sum(axis=1)) # 沿着纵轴计算求和
print('数组的均值为:', np.mean(arr)) # 计算数组均值
print('数组横轴的均值为:', arr.mean(axis=0)) # 沿着横轴计算数组均值
print('数组纵轴的均值为:', arr.mean(axis=1)) # 沿着纵轴计算数组均值
print('数组的标准差为:', np.std(arr)) # 计算数组标准差
print('数组的方差为:', np.var(arr)) # 计算数组方差
print('数组的最小值为:', np.min(arr)) # 计算数组最小值
print('数组的最大值为:', np.max(arr)) # 计算数组最大值
print('数组的最小元素为:', np.argmin(arr)) # 返回数组最小元素的索引
print('数组的最大元素为:', np.argmax(arr)) # 返回数组最大元素的索引
代码解析:
创建一个二维数组arr
,然后计算数组的和、均值、标准差、方差、最小值、最大值以及最小和最大元素的索引,分别沿着横轴和纵轴进行计算。
代码 2 - 51:数组的累计和与累计积
python">arr = np.arange(2, 10)
print('创建的数组为:', arr)
print('数组元素的累计和为:', np.cumsum(arr)) # 计算所有元素的累计和
print('数组元素的累计积为:\n', np.cumprod(arr)) # 计算所有元素的累计积
代码解析:
创建一个数组arr
,使用np.cumsum
函数计算数组元素的累计和,使用np.cumprod
函数计算