文章目录
为什么要学numpy??
- 快速
- 方便
- 科学计算的基础库
什么是numpy??
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
numpy数组基础
numpy创建数组(矩阵)
- 创建数组
- numpy中矩阵的类名
- numpy中数据的类型
- 指定类型的数组
- numpy 中的小数
创建数组
①通过array()创建数组
import numpy as np
# 使用numpy创建数组,得到ndarray的类型
t1 = np.array([1, 2, 3, ])
print(t1) # [1 2 3]
②通过arange()创建数组
import numpy as np
t3 = np.arange(10) # arange()的用法等于array(range()),是numpy所特有的
print(t3) # [0 1 2 3 4 5 6 7 8 9]
print(type(t3)) # <class 'numpy.ndarray'>
注意:arange()是numpy中特有的方法,等于array(range())
import numpy as np
import random
t2 = np.array(range(10))
print(t2) # [0 1 2 3 4 5 6 7 8 9]
print(type(t2)) # <class 'numpy.ndarray'>
numpy中矩阵的类名(numpy.ndarray)
t1 = np.array([1, 2, 3, ])
print(type(t1)) # <class 'numpy.ndarray'>
numpy中数据的类型 :dtype
# dtype 数据的类型
print(t3.dtype) # int32
注意:dtype 后面没有括号,且当生成ndarray时,若元素类型不同,则每个元素的数据类型都会被转为相同的类型
import numpy as np
t1 = np.array([1, 2, 3, True, 2.5, 6.1,])
print(t1.dtype)
t2 = np.array([1, 2, 3, True])
print(t2.dtype)
for i in t2:
print(type(i))
结果
补充
指定类型的数组
①创建指定类型的数组
# 指定创建的数组的数据类型
t4 = np.array(range(1, 4), dtype=float) # dtype可以是类型
print(t4) # [1. 2. 3.]
t5 = np.array([1, 1, 0, 1, 1, 0], dtype="bool") # dtype也可以是字符串
print(t5) # [ True True False True True False]
创建指定类型的数组时,只需要在创建数组的时候,在后面加上 (dtype=类型)
②修改数组的数据类型:astype(dtype)
# 修改数组的数据类型
t6 = t5.astype("int8")
print(t6) # [1 1 0 1 1 0]
print(t6.dtype) # int8
numpy中的浮点数:random.random()
①创建浮点数数组
#随机生成10个浮点数的矩阵
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype) #float64
#生成3行4列的浮点数矩阵
t9 = np.random.random((3,4))
print(t9)
②设定浮点数位数
注意:原数组不变,且新数组遵循四舍五入的原则
# 修改浮点型的小数位数,四舍五入
t8 = np.round(t7,2) #round()取小数
print(t8) #[0.99 0.5 0.52 0.54 0.47 0.16 0.61 0.43 0.32 0.45]
numpy的方法
数组的形状
①查看数组的形状:t.shape
注意:没有括号,shape后面没有括号
返回值解读:1.有几个数字就是几维,没有数字时是一维.
2.每个数字依次代表第 n,(n-1),(n-2)…1维的划分层次
import numpy as np
# 数组的形状
t0 = np.array(12)
print(t0.shape) # ()
t1 = np.array(range(5))
print(t1.shape) # (5,)
t2 = np.array([[1, 2, 3], [4, 5, 6]])
print(t2.shape) # (2, 3)
t3 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [1, 5, 9]]])
print(t3.shape) # (2, 2, 3) 2块2行3列
''' 总结:
获取数组t的形状:t.shape
!!!!没有括号,shape后面没有括号
返回值解读:
有几个数字就是几维,没有数字时是一维.
每个数字依次代表第(n-1),(n-2)...1维的划分
'''
②修改数组的形状:t.reshape()
注意:该方法并没有改变原数组的形状
import numpy as np
# 改变数组的形状
t4 = np.arange(12)
print(t4.reshape((3, 4))) # 3行4列
print(t4) # t4并没有变化
'''总结:
改变数组形状,调用方法reshape()
注意:该方法并不会改变数组原有的形状
'''
# 误区
t5 = np.arange(24).reshape(2, 3, 4)
print(t5.shape)
# 一维
print(t5.reshape((24,)))
# 二维,1行24列
print(t5.reshape((1, 24)))
# 24行1列
print(t5.reshape((24, 1)))
'''
print(t5.reshape((24,))),print(t5.reshape((1,24)))
两者的区别是:后者比前者多了一个中括号
'''
③获取某数组的一维数组:
方式一:<不建议使用>t = t.()(t.shape[n-1]*t.shape[n-2]*…*t.shape[0])
方式二:t.flatten()
数组的计算
轴
在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个1维数组,只有一个0轴,对于2维数组(shape(2,2)),有O轴和1轴,对于三维数组(shape(2,2,3)),有0,1,2轴.
0表示行,1表示列
0表示块,1表示行,2表示列
数组与数之间的运算
数组与数值进行运算时,只需要将数组中每一个数与数值进行相应的运算即可
注意:在矩阵运算中,有时一些没有意义的运算,例如某个矩阵除以0,并不会出现计算不出来的结果
数组之间的运算
①相同形状的数组间的计算
对应元素进行运算,计算后的数组形状和原数组相同
②二维数组与单行/列的数组进行运算
与单行进行运算
与单列进行运算
总结:
一个n行m列形状的数组,与单行或单列的数组进行运算时,该数组必须满足 行=n 或 列=m ,否则会报错,且计算方式为每一行对应相运算或每一列相运算
③
数组的转置
转置
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据
实现转置:以t为例
方式一:transpose()
t = t.transpose())
方式二:T
t = t.T
方式三:swapaxes(1,0)
t = t.swapaxes(1,0)
numpy读取数据
csv:Comma-Separated Value,逗号分隔值文件显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
import numpy as np
us_file_path = "youtube_video_data/US_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
print(t1)
数据:
链接:https://pan.baidu.com/s/1cceU04a7iNty0sINRFAUeA
提取码:m7x1
❤️ numpy的索引和切片(重点)
①取值:
import numpy as np
us_file_path = "youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "youtube_video_data/GB_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
print(t1)
#numpy的索引和切片
#取某一行,第三行为例
print(t1[2])
#取连续的多行,第三行及其之后的每一行
print(t1[2:])
#取不连续的多行,1,3,7,8行为例
print(t1[[0,2,6,7],])
#取某一列,第一列
print(t1[:,0])
#取连续的多列,3,.....
print(t1[:,2:])
#取不连续的列,1,3,4
print(t1[:,[0,2,3]])
#取行和列,3行4列de值
print(t1[2,3])
#取多行多列,3-5行2-4列
b = t1[2:5,1:4] #注意前面是(列/行-1),后面是(行/列),左闭右开
print(b)
#取多个不相邻的点,例如(1,1)(3,2)(5,2)的值
c = t1[[0,2,4],[0,1,1]] #前面是 行-1,后面是 对应的列-1
print(c)
②修改值
1.比如我们想要把t中小于10的数字替换为3
t[t < 10] = 3
print(t)
2.如果我们想把t中小于10的数字替换为0,把大于20的替换为20,应该怎么做??
where()的用法
# (t本身没有变,所以修改要加一个赋值操作)
t = np.where(t<10,0,10) #where的解释:t<10,if True,t=0;else t=10
print(t)
3.如果我们想将小于10的替换为10,大于18的替换为18
clip()的用法——剪裁操作
#(t本身没有变,所以修改要加一个赋值操作)
t = t.clip(10,18) #clip的解释:if t<10,t=10;if t>18,t=18
print(t)
numpy中关于数组的更多用法
1.获取最大值和最小值的位置:argmax()/argmin()
注意索引从0开始
0表示行,每行有3个值,返回值为对应的最大值或最小值的行
1表示列,每列有4个值,返回值为对应的最大值或最小值的列
t = np.array([[2,1,3],[8,9,4],[0,2,7],[1,6,2]])
print(t)
print(np.argmax(t,axis=0))#[1 1 2]每列最大值的索引,索引值为对应行
print(np.argmax(t,axis=1))#[2 1 2 1]每行最大值的索引
print(np.argmin(t,axis=0))#[2 0 3]每列最小值的索引
print(np.argmin(t,axis=1))#[1 2 0 0]每行最大值的索引
2.创建一个全为0的数组:zeros()
3行4列为例 #注意是浮点型
print(np.zeros((3, 4)))
3.创建一个全为1的数组:ones()
2行3列为例 #注意是浮点型
print(np.ones((2,3)))
4.创建一个对角线全为1,其余部分全为0的方阵 :eye()
#注意是浮点型
print(np.eye(3))
5.numpy生成随机数
numpy中的nan
1.nan是什么???
nan:not a number 表示不是一个数字
2.什么时候会出现nan?
①当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
②当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷天、一个数除以0)
补充:inf:infinity
inf 表示正无穷,-inf表示负无穷
3.如何指定一个nan或inf??
import numpy as np
a = np.nan
b = np.inf
numpy 在nan的注意点
1.两个nan是不相等的
2.np.nam != np.nan
3.利用两个nan不相等的性质,可以判断一个数组中nan的个数
np.count_nonzero(t!=t)
4.判断一个数字是否为nan
isnan(),返回值为bool型,通过此种方法,可以把nan进行一次性的替换
#例如,把数组t中所有的nan换成0
t[np.isnan(t)] = 0
5.nan和任何值的计算结果都为0
一般情况下,如果有数组缺失,且缺失值为nan,我们通常把缺失的值换为均值或中值,或者是直接删除有缺失值的一行
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)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,约不稳定