一、基本数据结构
-
numpy介绍
numpy是一个专门用于矩阵化运算、科学计算的开源PythonnumPy将Python相当于变成一种免费的更强大的Matlab系统
(1)强大的 ndarray 多维数组结构
(2)成熟的函数库
(3)用于整合C/C++和Fortran代码的工具包
(4)实用的线性代数、傅里叶变换和随机数模块
(5)Numpy和稀疏矩阵运算包scipy配合使用非常方便 -
基本数据结构ndarray
矩阵表示:使用numpy,易得到二维矩阵eg: # 使用numpy之前必须先导入包 import numpy as np array = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) print(array) print(type(array)) 输出结果: [[1 2 3 4] [5 6 7 8]] <class 'numpy.ndarray'>
作为ndarray对象里的数据有时并不是所需要的,那么可以使用ndarray对象的astype() 方法转为指定的数据类型
eg: a2 = np.array(["1", "2", "3", "4"]) print(a2) # 转换类型 print(a2.astype("int")) # 查看矩阵信息(几行几列) print(a2.shape) print(array.shape) 输出结果: ['1' '2' '3' '4'] [1 2 3 4] (4,) (2, 4)
二、ndarray相关操作
-
索引
将数据转为ndarray对象后,会需要按某种方式来抽取数据
ndarray对象提供了两种索引方式:
切片索引
切片索引和对列表list的切片索引相似,不过由原本的一维切片变为多维
索引后还可以直接对应该位置重新赋值
可通过shape属性得到数组的行数和列数
eg: a3 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 切片之后类型还是 ndarray print(a3) # 取某一个位置的数据 print(a3[1, 2]) # 取一部分数据 print(a3[1:, 2:]) # 矩阵翻转 print(a3[::-1, ::-1]) print(a3[::-1, ::]) 输出结果: [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] 7 [[ 7 8] [11 12]] [[12 11 10 9] [ 8 7 6 5] [ 4 3 2 1]] [[ 9 10 11 12] [ 5 6 7 8] [ 1 2 3 4]]
布尔值索引
通过添加条件判断数组中每个值的真/假转为布尔值再对原数组进行索引,为真(True)时会被抽取出来eg: # 布尔值索引 print(a3[a3 > 5]) print(a3 > 5) 输出结果: [ 6 7 8 9 10 11 12] [[False False False False] [False True True True] [ True True True True]]
-
切分
使用split将ndarray按照行平均分为几个ndarray -
重构
通过 reshape 方法将所有元素按照指定行指定列进行重构eg: # 重构 print(a3.reshape(2, 6)) 输出结果: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]]
-
拼接
通过 vstack 沿纵轴拼接
通过 hstack 沿横轴拼接
通过 concatenate 进行拼接 -
转置、翻转
转置: transpose 方法或者在数组后加 .T
翻转: fliplr 左右翻转、flipud 上下翻转eg: # 转置 print(a3.transpose()) print(a3.T) # 左右翻转 print(np.fliplr(a3)) # 上下翻转 print(np.flipud(a3)) # 上下左右翻转 print(np.flip(a3)) 输出结果: [[ 1 5 9] [ 2 6 10] [ 3 7 11] [ 4 8 12]] [[ 1 5 9] [ 2 6 10] [ 3 7 11] [ 4 8 12]] [[ 4 3 2 1] [ 8 7 6 5] [12 11 10 9]] [[ 9 10 11 12] [ 5 6 7 8] [ 1 2 3 4]] [[12 11 10 9] [ 8 7 6 5] [ 4 3 2 1]]
-
对位运算
指ndarray进行加减乘除运算时,使对应位置的数值进行加减乘除运算eg: # 对位运算 a6 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) a7 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) print(a6 + a7) print(a6 - a7) print(a6 * a7) print(a6 / a7) 输出结果: [[ 2 4 6 8] [10 12 14 16] [18 20 22 24]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]] [[ 1 4 9 16] [ 25 36 49 64] [ 81 100 121 144]] [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]
三、结构化数据
-
举例说明
(1) 首先你需要一个数据文件,此处我新建了一个test.txt,内容如下
1,2,3
4,5,6
7,8,9
(2) 对此文件进行处理lines = [] with open(r"E:\PycharmProjects\hello\test.txt", "r") as file: lines = file.readlines() test = [tuple(line.strip().split(",")) for line in lines] print(test) dtype = [("id", int), ("name", object), ("score", int)] np_test = np.array(test, dtype=(dtype)) #按名称索引 print(np_test["id"]) #按名称索引 获取score=3的数据 print(np_test[np_test["score"] == 3]) 输出结果: [('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9')] [1 4 7] [(1, '2', 3)]
四、内置操作函数
-
数学函数
numpy.log()函数是numpy模块提供的现成自然对数函数
eg: a8 = np.array([1, 2, 3, 4]) print(np.log(a8)) print(np.sin(a8)) 输出结果: [0. 0.69314718 1.09861229 1.38629436] [ 0.84147098 0.90929743 0.14112001 -0.7568025 ]
-
运算函数
在计算的时候,会用到差分、累加的情况。numpy提供很多相关的运算函数
差分:numpy.diff()方法eg: print(np.diff(a8)) 输出结果: [1 1 1]
对于二维矩阵,需要指明是对哪一个维度进行差分
eg: a9 = np.array([[1, 2, 3], [4, 5, 6]]) # 行与行之间差分 print(np.diff(a9, axis=0)) # 列于列之间差分 print(np.diff(a9, axis=1)) 输出结果: [[3 3 3]] [[1 1] [1 1]]
-
统计函数
numpy提供了很多计算最大值、最小值、均值、中位数等统计量的 函数,比如统计最大值的函数numpy.amax()
eg: # 计算标准差 print(np.std(a9)) 输出结果: 1.707825127659933
五、随机模块random
-
伪随机数的产生,可从离散分布和连续分布中产生
在蒙特卡洛方法、随机积分、随机过程模拟等很多方面都有应用
指定随机种子(seed)产生相同的随机数序列eg: # 产生一个3行4列的矩阵,其中的每一个元素为[0, 1]之间的浮点型随机数 r1 = np.random.rand(3, 4) print(r1) # 产生一个[0, 10]之间的整型随机数 print(np.random.randint(0, 10)) 输出结果: [[0.94162658 0.09145497 0.56586785 0.19829864] [0.10717488 0.28461505 0.56043926 0.78945516] [0.59883978 0.08212525 0.97394346 0.32761456]] 8
-
常用分布的产生方式
eg: # 二项分布:产生5个服从二项分布B(5, 0.5)的样本 print(np.random.binomial(n=5, p=0.5, size=5)) # 均匀分布:产生5个服从均匀分布U[-1, 1]的样本 print(np.random.uniform(-1, 1, 5)) # 标准正态分布:产生2*5的标准正态分布样本 print(np.random.normal(size=(2, 3))) # 正态分布:产生2*5的均值为0,标准差为5的正态分布样本 print(np.random.normal(loc=0, scale=5, size=(2, 3))) 输出结果: [1 2 2 1 0] [-0.52674721 0.50713521 -0.23635187 -0.37280082 -0.7381546 ] [[-0.69065465 0.02140358 0.22315663] [ 0.12292919 2.07374299 0.92140683]] [[-0.96394493 2.52926172 0.27291902] [ 1.36460891 -3.24371614 -3.30661156]]