numpy学习
什么是numpy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分python科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
优点:
- 快速
- 方便
- 科学计算的基础库
利用numpy创建数组(矩阵)
import random
import numpy as np
# 创建一个指定的一维数组
t1 = np.array([1, 2, 3, ])
print(t1)
print(type(t1))
t2 = np.array(range(10))
print(t2)
print(type(t2))
# 传入的参数跟range函数类似,生成相应可迭代对象传入
t3 = np.arange(4, 10, 2)
print(t3)
print(type(t3))
# 指定数组中的数据类型
t4 = np.array(range(1, 4), dtype=float)
print(t4)
print(t4.dtype)
t5 = np.array([5, 1, 0, 1, 0, 1], dtype=bool)
print(t5)
print(t5.dtype)
# 将数组中的数据类型改变
t6 = t5.astype("int64")
print(t6)
print(t6.dtype)
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
# 保留数组中数据两位小数
t8 = np.round(t7, 2)
print(t8)
数组的形状
import numpy as np
t1 = np.arange(12)
print(t1)
print(t1.shape)
t2 = np.array([[1, 2, 3], [4, 5, 6]])
print(t2)
print(t2.shape)
t3 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(t3)
print(t3.shape)
t4 = np.arange(12)
t5 = t4.reshape((3, 2, 2))
print(t5)
# 将数组拉成一维
t6 = t5.flatten()
print(t6)
数组计算
import numpy as np
t1 = np.arange(24)
t2 = t1.reshape((4, 6))
print(t2)
print(t2 + 2)
print(t2 * 2)
print(t2 / 2)
t3 = np.arange(100, 124).reshape((4, 6))
print(t3)
# 对应位置的数进行相加
print(t3 + t2)
# 对应位置的数进行相乘
print(t2 * t3)
t4 = np.array([0, 1, 2, 3, 4, 5])
# 将t2中的每一行与t4相减
print(t2 - t4)
轴(axis)
在numpy中可以理解为方向,使用0,1,2,…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2,3)),有0,1,2轴
有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值
numpy读取数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文件,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所有很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的。
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
参数 | 解释 |
---|---|
frame | 文件、字符串或产生器,可以是.gz或bz2压缩文件 |
dtype | 数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float |
delimiter | 分隔字符串,默认是任何空格,改为逗号 |
skiprows | 跳过前x行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认False |
import numpy as np
us_file_path = "./data/US_video_data_numbers.csv"
uk_file_path = "./data/GB_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path, delimiter=",", dtype="int")
print(t1)
numpy中的转置
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据。
import numpy as np
t1 = np.arange(24).reshape((4, 6))
print(t1)
t2 = t1.transpose()
print(t2)
t3 = t1.T
print(t3)
t4 = t1.swapaxes(1, 0)
print(t4)
三种方法都可以。
numpy读取和存储数据
numpy索引和切片
import numpy as np
us_file_path = "./data/US_video_data_numbers.csv"
uk_file_path = "./data/GB_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path, delimiter=",", dtype="int")
print(t1)
print("*" * 100)
# 取行
print(t1[2])
print("*" * 100)
# 取连续的多行
print(t1[2:])
print("*" * 100)
# 取不连续的多行(第3,9,11行)
print(t1[[2, 8, 10]])
print("*" * 100)
# 取列
print(t1[1, :]) # 取第一行所有的
print(t1[1, ::-1]) # 取第一行所有的,并倒序
print(t1[1, 0:1]) # 取第一行第一个元素
print(t1[:, 0]) # 取所有行的第一个元素
print("*" * 100)
# 取连续的多列
print(t1[:, 1:3]) # 取所有行的第2,3列所有元素
print("*" * 100)
# 取不连续的多列
print(t1[:, [0, 2, 3]])
print("*" * 100)
# 取多行多列
print(t1[2, 3]) # 取第3行第4列
print(t1[2:5, 1:4]) # 取第3行到第5行,第2列到第4列的元素
print("*" * 100)
# 取不相邻的点
print(t1[[0, 2], [0, 1]]) # 取(0,0)点和(2,1)点
print("*" * 100)
numpy更多的索引方式
numpy中布尔索引
t1 = np.arange(24).reshape((4, 6))
print(t1)
# 取t1中比10小的元素
print(t1 < 10)
# 把t1中比10小的元素赋值为3
t1[t1 < 10] = 3
print(t1)
numpy中三元运算符
t1 = np.arange(24).reshape((4, 6))
print(t1)
# 把t1中小于10的元素赋值为0,大于10的元素赋值为10
t2 = np.where(t1 < 10, 0, 10)
print(t2)
numpy中的clip(裁剪)
t1 = np.arange(24).reshape((4, 6))
print(t1)
# 把小于10的付赋值为10,大于18的赋值为18
t2 = t1.clip(10, 18)
print(t2)
numpy中的nan和lnf
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)
import numpy as np
print(np.nan == np.nan)
t1 = np.array([1., 2., np.nan])
print(t1)
print(t1 != t1)
# 可以用来统计nan个数
a = np.count_nonzero(t1 != t1)
print(a)
print(np.isnan(t1))
b = np.count_nonzero(np.isnan(t1))
print(b)
numpy中常用统计函数
求和:t.sum(axis=None)
均值:t.mean(a,axis=None)
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None)即最大值和最小值的差
标准值:t.std(axis=None)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大,一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,越不稳定。
数组的拼接
竖立拼接:
np.vstack((t1,t2))
水平拼接:
np.hstack((t1,t2))
数组的行列交换
t[[1,2],:]=t[[2,1]:] 行交换
t[:,[0,2]]=t[:,[2,0]] 列交换
numpy更多好用的方法
获得最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
创建对角线为1的正方形数组(方阵):np.eye(3)
numpy生成随机数
参数 | 解释 |
---|---|
.rand(d0,d1,…,dn) | 创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1 |
.randn(d0,d1,…,dn) | 创建d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1 |
.randint(low,high,(shape)) | 从给定上下限范围选取随机数整数,范围是low,high结束值,size形状 |
.uniform(low,high,(size)) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 |
.normal(loc,scale,(size)) | 从指定正态分布中随机抽取样本,分布中心是loc(概率分布的均值),标准差是scale,形状是size |
.seed(s) | 随机数种子,s是给定的种子值,因为计算机生成的是伪随机数,所以通过设定相同的随机数种子,可以生成相同的随机数。 |
import numpy as np
t1 = np.random.randint(10, 20, (4, 5))
print(t1)
np.random.seed(10)
t2 = np.random.randint(0, 20, (3, 4))
print(t2)