numpy使用
一.为什么使用numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算.
Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库!
二.numpy的基本使用
1. 创建数组
import numpy as np
import random
# 创建数组
t1 = np.array(range(1, 10))
print(t1)
# 判断t1的类型
print(t1.dtype)
# 方法二
t2 = np.arange(4, 10, 2) # arrange(start,end,step),开始值到结束值每隔2,取一个值
print(t2)
print(t2.dtype)
# numpy的数据类型
t3 = np.array(range(12), dtype="float") # 设置t3的类型为float类型
print(t3)
print(t3.dtype)
# 修改类型
t4 = np.array([random.random() for i in range(10)], dtype="float")
print(t4)
print(t4.dtype)
# a = np.array([1, 0, 0, 1], dtype=bool)
# a.astype(np.int8)
# print(a)
# print(a.dtype)
t5 = np.round(t4, 3) # 取t4的三位小数
print(t5)
# 数组的形状
t6 = np.array([[1, 2, 3, 4, 5, 6]])
print(t6.shape)
print(t6)
# 改变形状
t7 = t6.reshape(2, 3)
print(t7)
print(t7.shape)
# 变成一维数组
t8 = t7.flatten()
print(t8.shape)
print(t8)
2.numpy 的数据类型
3.numpy中数组的计算
- 相同形状的数组,加减乘除都是在相对应的位置上进行操作
- 不同形状的数组则要在相同轴上的位置进行操作
4. numpy的广播原则(轴)
在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
二维的 轴
三维的轴
5. numpy读取数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
# fname:文件名,dtype:数据类型,delimiter:分割符,比如csv文件的分隔符是","
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
6.numpy的转置
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据
方式一
方式二,三
swapaxes直接将0轴和1轴进行互换,达到转置的作用,剩下两种则是直接调用,不难理解
7.numpy索引和切片
学习这个的原因:可以更好的准确的取一个数组指定的行和列所指向的数据.
import numpy as np
# 创建数组
array = np.arange(24).reshape(4, 6).astype(float)
print("array:")
print(array)
# 打印第二行后所有的数据
print("第二行后所有的数据:")
print(array[2:])
# 打印1-3行
print("1-3行所有的数据:")
print(array[1:3])
# 打印2-4列
print("2-4列所有的数据:")
print(array[:, 2:4])
# 打印1-3行,2-5列的数据
print("1-3行,2-5列所有的数据:")
print(array[1:3, 2:5])
结果:
7.1 numpy中的布尔索引
import numpy as np
# 创建数组
array = np.arange(24).reshape(4, 6).astype(float)
print("array:")
print(array)
print("判断是否小于10:")
print(array < 10)
# 将值进行替换
array[array < 10] = 0
print("将小于10的索引位置的值改为0")
print(array)
7.2 numpy中的三元运算符where
import numpy as np
# 创建数组
array = np.arange(24).reshape(4, 6).astype(float)
print("array:")
print(array)
# 将小于10的赋值为0,大于的赋值为10
array = np.where(array < 10, 0, 10)
print("改变后的结果为")
print(array)
7.3 裁剪(clip)
我们要把小于10的赋值为10,大于15的赋值为15,此时该怎么做呢,而用where则不行,单独的两次布尔改值有比较麻烦,
array[array < 10] = 10 array[array > 15] = 15
所以此时用裁剪就比较方便
import numpy as np
# 创建数组
array = np.arange(24).reshape(4, 6).astype(float)
print("array:")
print(array)
# 裁剪
print("裁剪后的结果:")
print(array.clip(10, 18))
8.numpy中的nan和inf
nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
nan 和 inf 的数据类型都是float
9.numpy中的计算
- 1.求和
- np.sum(array,axis=None) = array.sum(axis=None)
- array为求取的数组
- axis=0求取每一列的和
- axis=1求取每一行的和
- 2.求平均值
- np.mean(array,axis=None) = array.mean(axis=None)
- array为求取的数组
- axis=0求取每一列的均值
- axis=1求取每一行的均值
- 3.求中值
- np.median(array,axis=None) ≠ array.median(axis=None)
-
- array为求取的数组
- axis=0求取每一列的中值
- axis=1求取每一行的中值
- 4.求取最大值
- np.max(array,axis=None) = array.max(axis=None)
- 5.求取最小值
- np.min(array,axis=None) = array.min(axis=None)
- 6.求极值(也就是最大值与最小值只差)
- np.ptp(array,axis=None) ≠ array.ptp(axis=None)
- 7.求标准差
- np.std(array,axis=None)
- 8.获取最大值的位置
- np.argmax(array,axis=None)
- 9.获取最小值的位置
- np.argmin(array,axis=None)
- 10.创建全为0的数组
- t = np.zeros((3, 4)) # shape为3 x 4 全为0的数组
- 11.创建全是1的数组
- t =np.ones((3, 4)) # shape为3 x 4 全为0的数组
- 12.创建一个对角线为1的正方形数组(方阵):
- t = np.eye(3) # shape为3 x 3全是1的数组
- 13.随机数np.random.之下
import numpy as np
# 创建数组
array = np.arange(24).reshape(4, 6).astype(float)
print("array:")
print(array)
# 求取array的总和
print("数组总和")
print(np.sum(array))
# 求每一列和的值
t = np.sum(array, axis=0)
print("每一列的和")
print(t)
# 求每一行和的值
t = np.sum(array, axis=1)
print("每一行的和")
print(t)
# 求取array的平均值
print("数组的均值")
print(np.mean(array))
# 求每一列的均值
t = np.mean(array, axis=0)
print("每一列的均值")
print(t)
# 求每一行的均值
t = np.mean(array, axis=1)
print("每一行的均值")
print(t)
# 求取中值
print("数组的中值")
print(np.median(array))
# 求每一列的中值
t = np.median(array, axis=0)
print("每一列的中值")
print(t)
# 求每一行的中值
t = np.median(array, axis=1)
print("每一行的中值")
print(t)
import numpy as np
# 创建数组
array = np.arange(24).reshape(4, 6).astype(float)
print("array:")
print(array)
array[1:3, 2:5] = np.nan
print("用nan赋值后的数组")
print(array)
for i in range(array.shape[1]): # 遍历每一列
temp_col = array[:, i] # 获取每一列的元素值
nan_num = np.count_nonzero(np.isnan(temp_col)) # 得到nan的数量
if nan_num > 0: # 判断nan是否存在
temp_not_nan_col = temp_col[temp_col == temp_col]
# 选中nan的位置,用均值替换
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
print("结果")
print(array)
9.数组的拼接
10.numpy 更为具体的操作
https://blog.youkuaiyun.com/a373595475/article/details/79580734