一、基本数据结构
- numpy介绍
numpy是一个专门用于矩阵化运算、科学计算的开源Python
numPy将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]]