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 浅拷贝深拷贝

  1. 浅拷贝 a = b, a = b[:]
  2. 深拷贝 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

posted @ 2021-03-29 19:11  ShanCe-刘勇  阅读(79)  评论(0编辑  收藏  举报