numpy
1. matplotlib ->绘图
2. numpy -> 处理数值型数组
3. pandas -> 处理字符串, 时间序列、字典等
二、numpy 学习
一个在python中做科学计算的基础库,重在数值计算, 也在大部分python科学计算库的基础库, 多用于大型、多维数组上执行数值运算。
1.安装
pip install numpy
2.创建数据(矩阵)
import numpy as np
t1 = np.array([1,2,3])
print(t1)
print(type(t1))
t2 = np.array(range(10))
print(t2)
t3 = np.arange(4, 10, 2) # 和range 类似,不同的是生成的数据类型
print(t3)
print(t3.dtype) # 查看存储类型, int32
结果:
[1 2 3]
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
[4 6 8]
int32
常用数据类型
3.数据类型操作
3.1 指定数据类型
注意 bool 类型会将其转换为 True False
t4 = np.array(range(1,4), dtype="i1")
3.2 调整数据类型
t5 = t4.astype("int8")
3.3 保留小数为
t8 = np.round([1.112,0.333,0.567], 2)
--------结果
[1.11 0.33 0.57] # 四舍五入
4.数组的形状 几行几列 shape
t4 = np.array([1,2,3,4,5,6,7,8,9])
print(t4)
print(t4.shape)
t5 = np.array(([1,2,3],[4,5,6],[7,8,9]))
print(t5)
print(t5.shape)
结果:
[1 2 3 4 5 6 7 8 9]
(9,) 这个代表只有一行9列
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3) 三行三列
5. reshape 转换为几行几列(不改变源值)
t4 = np.array([1,2,3,4,5,6,7,8,9])
t5 = t4.reshape(3,3)
print(t4.reshape(3,3))
结果
[[1 2 3]
[4 5 6]
[7 8 9]]
print(t5.reshape(9,)) # 转换为1维
print(t5.flatten()) # 直接转换为1行
6.运算
广播原则:
如果两个数组的后缘维度(从末尾开始计算的维度)轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失或长度为1的维度上进行。
6.1 加减乘除数字运算:
t5 + 2
广播机制, 在运算的时候对数组里的所有的值都进行计算
结果:
[[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
6.2 数组与数组进行运算
-
行列位数相同的时候: 对应位置进行运算
-
列位数相同的时候: 每一行会与其对应位置计算
t6 = np.array([3,3,3]) t5 - t6 t5 为 array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 结果: array([[-2, -1, 0], [ 1, 2, 3], [ 4, 5, 6]])
-
行位数相同的时候: 每一列会与其对应位置计算
In [26]: t5
Out[26]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [27]: t6 = np.array([[3],[3],[3]])
In [28]: t5 -t6
Out[28]:
array([[-2, -1, 0],
[ 1, 2, 3],
[ 4, 5, 6]])
In [29]: t6
Out[29]:
array([[3],
[3],
[3]])
- 行列都不相同的时候:不能进行计算
7.轴
7.1 概念
0,1,2标识
一维: 0 标识行
二维:0 标识行 ,1 标识列
三维:0 标识行, 1 标识列, 2 标识 z 轴
shape 的结果是(2,0,1)->(z, x, y)
7.2平均值
二位数组求平均值,需要指明哪个方向的
8 读取数据
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)
参数解释:
fname : 文件路径可以是 .gz 或bz2 压缩文件
dtype : 指定读出结果的类型
delimiter : 分隔字符串(你文件中分割数据的字符), 默认为空格
skiprows : 跳过前x行,一般跳过第一行表头
usecols : 使用那几列, 索引, 元组类型
encoding : 打开的字符编码
unpack : 如果为True, 读入属性将分别写入不同数组变量, False 读入数据只写一个数组变量,默认为False(行变列,列变行)
us_file_path = "./data/1.csv" # 1.csv 的内容在最下边有
t1 = np.loadtxt(us_file_path, delimiter=",", skiprows=1, encoding="utf-8", usecols=[1,2,3], unpack=True) # 因为其他列不是数字,所以只取这几列的东西。
t2 = np.loadtxt(us_file_path, delimiter=",", skiprows=1, encoding="utf-8", usecols=[1,2,3])
print(t1)
print(t2)
结果:
[[0.4 0.7 0.6 0.8 0.7 1. 1.5 1.6 2.6 4. 1.2 2.6 1.4 1.4
0.6 0.7 0.8 0.9 3.5 1.7 ]
[0.5 0.75 0.75 0.9 1. 1.4 1.75 1.9 2.9 5.5 1.7 3.7 1.95 1.85
0.8 0.95 1. 1.15 3.75 1.95]
[0.6 0.8 0.9 1. 1.3 1.8 2. 2.2 3.2 7. 2.2 4.8 2.5 2.3
1. 1.2 1.2 1.4 4. 2.2 ]]
[[0.4 0.5 0.6 ]
[0.7 0.75 0.8 ]
[0.6 0.75 0.9 ]
[0.8 0.9 1. ]
[0.7 1. 1.3 ]
[1. 1.4 1.8 ]
[1.5 1.75 2. ]
[1.6 1.9 2.2 ]
[2.6 2.9 3.2 ]
[4. 5.5 7. ]
[1.2 1.7 2.2 ]
[2.6 3.7 4.8 ]
[1.4 1.95 2.5 ]
[1.4 1.85 2.3 ]
[0.6 0.8 1. ]
[0.7 0.95 1.2 ]
[0.8 1. 1.2 ]
[0.9 1.15 1.4 ]
[3.5 3.75 4. ]
[1.7 1.95 2.2 ]]
9 转置
t.T
t.transponse()
t.swapaxes(1,0) # 交换轴
10 numpy 的索引和切片
面对问题只想取某一行某一列的问题。
t2[2] # 取第2行, 行数从0开始
t2[2::] # 从第二行开始取
t2[[2,8,10]] # 取第2,8,10 行
取列
t2[1,:] # 取一行的所有列
t2[2:,:] # 取二行后的所有列
t2[:,0] # 取第一列
t2[:,2:] # 取所有行的第二列之后的所有列 连续
t2[:, [0,2]] # 取所有行的第0列和第2列
t2[3:6,0:3] # 取第三行到第6行,第6行取不到, 0列到3列第三列取不到
print(t2[[3,7],[0,2]]) # 只能取到对应位置的点 [0.8 2.2] 就是点(3,0)和点(7,2)的值
11 numpy修改值
取到值直接修改
11.1简单修改
t2[2,:] = 0
11.2 布尔修改
修改所有小于1的为3
t2[t2<1] = 3
因为 t2<3 每个位置返回的是True和False, t2[t2<1] = 3的意思的将所有为True的替换成3
11.3 多条件修改
np.where(t2<1,0,10) # 将小于1的替换成0,其他的替换成10
t2.clip(1, 2) # 把小于1的替换成1, 大于2的替换成2
12 数组拼接
np.vstack((t1,t2)) # 竖直拼接 t1在上 t2在下
np.hstack((t1,t2)) # 水平拼接
13 数组的行列交换
t2[[1,2],:] = t2[[2,1],:] # 行交换, 把1,2 行交换
t2[:,[1,2]] = t2[:,[2,1]] # 列交换
14 方法扩展
np.zeros((3,4)) # 生成一个三行四列全为0的数据
np.ones((3,4)) # 生成一个三行四列全为1的数组
np.eye(3) # 生成一个对角线为1的方阵, 边长为3
np.argmax(t2, axis=0) # t2 每一列的最大值
# 结果 [9 9 9]
np.argmin(t2, axis=1) # 每一行的最小值
np.count_nonzero(t2) # 不为零的个数
np.count_nonzero(t2 != t2) # 为nan的个数
np.isnan(t2) # 那个位置为nan 那个位置为True
np.sum(t2, axis=0) # 沿着行方向求列的和, axis 不写,默认求所有的和
15 生成随机数组
在每次随机之前,加上随机种子则后边每次生成的随机数都是一样的。
16 浅拷贝深拷贝
- 浅拷贝 a = b, a = b[:]
- 深拷贝 a = b.copy()
17 nan 和 inf
nan 表示不是一个数字, 属于float类型
inf 表示无穷 +inf 无穷大, -inf 无穷小
附属:
1.csv 内容
品名,最低价,平均价,最高价,规格,单位,发布日期,
大白菜,0.40,0.50,0.60,存储,斤,2021-03-25
大白菜,0.70,0.75,0.80,新,斤,2021-03-25
娃娃菜,0.60,0.75,0.90,大\小,斤,2021-03-25
芹菜,0.80,0.90,1.00,鲁,斤,2021-03-25
菠菜,0.70,1.00,1.30,长杆\冀,斤,2021-03-25
番茄,1.00,1.40,1.80,川鲁蒙,斤,2021-03-25
番茄(精品),1.50,1.75,2.00,普通,斤,2021-03-25
黄瓜,1.60,1.90,2.20,蒙辽袋\鲁,斤,2021-03-25
黄瓜(鲜干花),2.60,2.90,3.20,冀,斤,2021-03-25
小黄瓜,4.00,5.50,7.00,旱\荷兰,斤,2021-03-25
茄子,1.20,1.70,2.20,鲁\冀,斤,2021-03-25
架豆,2.60,3.70,4.80,\冀,斤,2021-03-25
尖椒,1.40,1.95,2.50,冀晋/鲁新,斤,2021-03-25
柿子椒,1.40,1.85,2.30,\鲁新,斤,2021-03-25
土豆,0.60,0.80,1.00,\冀,斤,2021-03-25
新土豆,0.70,0.95,1.20,陕冀云新,斤,2021-03-25
黄葱头,0.80,1.00,1.20,\蒙甘,斤,2021-03-25
红葱头,0.90,1.15,1.40,普通,斤,2021-03-25
葱,3.50,3.75,4.00,冀/苏鲁闽,斤,2021-03-25
吊冬瓜,1.70,1.95,2.20,桂,斤,2021-03-25