Day3
第二部分 numpy学习
1.什么是numpy
2.numpy基础
3.numpy常用方法
4.numpy常用统计方法
为什么要学习numpy
1.快速
2.方便
3.科学计算的基础库
什么是numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组(各种列表形式,例如列表嵌套)上执行数值运算
numpy创建数组(矩阵)
【示例】
#coding=utf-8 |
结果:
[1 2 3]
<class 'numpy.ndarray'>
int32
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
[4 6 8]
<class 'numpy.ndarray'>
numpy中常见的更多数据类型
数据类型的操作
【示例】
#numpy中的数据类型 |
结果:
<class 'numpy.ndarray'>
[1. 2. 3.]
float32
[ True True False True False False]
bool
[1 1 0 1 0 0]
int8
[0.77605271 0.83797713 0.21914121 0.00532719 0.40877846 0.46288983
0.92196868 0.60972947 0.88912385 0.60868958]
float64
那么问题来了,python中如何保留固定位数的小数?
使用round()
【操作】
#numpy中的小数 |
结果:
[0.77605271 0.83797713 0.21914121 0.00532719 0.40877846 0.46288983
0.92196868 0.60972947 0.88912385 0.60868958]
float64
[0.78 0.84 0.22 0.01 0.41 0.46 0.92 0.61 0.89 0.61]
数组的形状(几行几列的数组)
——————————————————————————————————————————
—————————————————————————————————————————
【示例】
#coding=utf-8 |
结果:
(24,)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
数组和数的计算(会应用于数组中的每一个数字)
这是一个numpy的广播机制造成的,在运算过程中,加减乘除的值1被广播到所有的元素上面
【示例】数组和数组的运算(对应位置上的数进行计算)
#coding=utf-8 t1=np.array([[1,2,3],[4,5,6]]) |
结果:
[[1 2 3]
[4 5 6]]
[[3 2 1]
[6 5 4]]
*******
t1+t2
[[ 4 4 4]
[10 10 10]]
t1*t2
[[ 3 4 3]
[24 25 24]]
【示例】除以0
t=np.array(range(24))
print(t/0)
结果:
[nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf
inf inf inf inf inf inf]
结果:(行和列两个维度都不相同不能进行计算)
ValueError: cannot reshape array of size 13 into shape (3,4)
——————————————————————————
【示例】不同维度数组计算
#coding=utf-8 |
结果:(t5的每一列减去t8的一列)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[0]
[1]
[2]
[3]]
t5-t8
[[ 0 1 2 3 4 5]
[ 5 6 7 8 9 10]
[10 11 12 13 14 15]
[15 16 17 18 19 20]]
注意:
但若两个数组的行和列都不相等,则无法进行计算。必须某一维度上一样才能进行计算
广播原则
怎么理解呢?
可以把维度指的是shape所对应的数字个数
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?
答:不能
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?
答:可以计算
【示例】
#coding=utf-8 |
结果:
[[[ 0 1]
[ 2 3]
[ 4 5]]
[[ 6 7]
[ 8 9]
[10 11]]
[[12 13]
[14 15]
[16 17]]]
[[0 1]
[2 3]
[4 5]]
[[[ 0 2]
[ 4 6]
[ 8 10]]
[[ 6 8]
[10 12]
[14 16]]
[[12 14]
[16 18]
[20 22]]]
注:2维数组只要有一个形状方向(行或列)一样,就可以计算
轴(axis)
在numpy中可以理解为方向,使用0,1,2...数字表示
对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向(行还是列)上面的数字的平均值
那么问题来了:
在前面的知识,轴在哪里?
回顾np.arange(0,10).reshape((2,5)),reshpe中2表示0轴长度(包含数据的条数)为2,1轴长度为5,2X5一共10个数据
二维数组的轴
三维数组的轴
明白了轴的概念之后,对于shape返回的结果和reshape的结果能够更加清楚
numpy读取数据
(numpy读取数据一般用的较少)
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量(["views","likes","dislikes","comment_total"])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作
【示例】读取csv数据
#coding=utf-8 |
结果:
[[4394029 7860119 5845909 ... 142463 2162240 515000]
[ 320053 185853 576597 ... 4231 41032 34727]
[ 5931 26679 39774 ... 148 1384 195]
[ 46245 0 170708 ... 279 4737 4722]]
****
[[4394029 320053 5931 46245]
[7860119 185853 26679 0]
[5845909 576597 39774 170708]
...
[ 142463 4231 148 279]
[2162240 41032 1384 4737]
[ 515000 34727 195 4722]]
unpack:实现转置
numpy中的转置
(对unpack的拓展,转置:行和列互换)
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据
①.transpose()
②.swapaxes(1,0)
③.T
以上的三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样
numpy读取和存储数据
那么,结合之前的所学的matplotlib把英国和美国的数据呈现出来?
看到这个问题,我们应该考虑什么?
我们想要反映出什么样的结果,解决什么问题?
选择什么样的呈现方式?
数据还需要做什么样的处理?
写代码
#coding=utf-8 |
结果:
[[4394029 320053 5931 46245]
[7860119 185853 26679 0]
[5845909 576597 39774 170708]
...
[ 142463 4231 148 279]
[2162240 41032 1384 4737]
[ 515000 34727 195 4722]]
numpy索引和切片
对于刚刚加载出来的数据,我如果只想选择其中的某一列(行)我们应该怎么做呢?
其实操作很简单,和python中列表的操作一样
是不是还可以加上步长呢?
【示例】
#取第3行(索引从0开始)
print(t2[2])
#取连续的多行(从第3行开始)
print(t2[2:])
#取不连续的多行(取第3,9,11行)
print(t2[[2,8,10]])
#取第一列(‘:’表示每行都要)
print(t2[:,0])
#取连续的多列(从第三列开始取)
print(t2[:,2:])
#取不连续的多列(第一列和第三列)
print(t2[:,[0,2]])
#取多行和多列,取第三行,第四列的值
a = t2[2,3]
print(a) --->170708
print(type(a)) ---><class 'numpy.int32'>
#取第3行到第5行,第2列到第4列
#取的是行和列交叉点的位置
b = t2[2:5,1:4]
print(b)
#取多个不相邻的点(0,0),(2,1),(2,3)
c = t2[[0,2,2],[0,1,3]]
print(c)
numpy中数值的修改
修改行列的值,我们能够很容易的实现,但是如果条件更复杂呢?
比如我们想要把t中小于10的数字替换为3
numpy中布尔索引
t[t<10]=0
那么问题来了:
如果我们想把t中小于10的数字替换为0,把大于10的替换为10,应该怎么做??
numpy中三元运算符
np.where(t<10,0,18)
把t中小于10的数字替换为0,把大于10的替换为10
那么问题来了:
如果我们想把t中小于10的数字替换为0,把大于20的替换为20,应该怎么做??
numpy中的clip(裁剪)
t.clip(10,18)
把t中小于10的数字替换为10,把大于18的替换为18
观察操作:
小于10的替换为10,大于18的替换为了18,但是nan没有被替换,那么nan是什么?
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呢?
注意他们的type类型
numpy中的nan的注意点
np.count_nonzero(t!=t) 判断nan是因为np.nan!=np.nan 所以t!=t可以判断nan的个数
【示例】
#coding=utf-8 |
结果:
False
True
1
[False False True False]
[ 1. 2. 0. 20.]
【示例】关于nan的计算
#coding=utf-8 |
结果:
[[ 0. 1. nan 2.]
[ 3. 4. 5. 6.]
[ 7. 8. 9. 10.]]
nan
[10. 13. nan 18.]
[nan 18. 34.]
numpy中的nan的注意点
那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值(中位数))或者是直接删除有缺失值的一行
那么问题来了:
如何计算一组数据的中值或者是均值
如何删除有缺失数据的那一行(列)[在pandas中介绍]
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)
注1:
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值,反映出数据的波动稳定情况,越大表示波动越大,约不稳定
注2.
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
【示例】nan统计函数
#coding=utf-8 |
结果:
[[ 0. 1. 0. 2.]
[ 3. 4. 5. 6.]
[ 7. 8. 9. 10.]]
[10. 13. 14. 18.]
[3.33333333 4.33333333 4.66666667 6. ]
[3. 4. 5. 6.]
[ 7. 8. 9. 10.]
[0. 1. 0. 2.]
[7. 7. 9. 8.]
[2.86744176 2.86744176 3.68178701 3.26598632]
ndarry缺失值填充均值
t中存在nan值,如何操作把其中的nan填充为每一列的均值
t = array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., nan, 9., 10., 11.],
[ 12., 13., 14., nan, 16., 17.],
[ 18., 19., 20., 21., 22., 23.]])
【示例】
#coding=utf-8 |
结果:
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
---------------------
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
麻烦么?学完pandas我们有更容易的方法处理缺失值
小结
1.如何选择一行或者多行的数据(列)?
切片(选一部分)和索引(选一个值)——
选择行t[2]、t[3:,:]/选择列t[:,4:]
/选择行列,连续的多行t[2:,:3];不连续的多行 t[[1,3],[2,4]]:选择的是(1,2),(3,4)两个位置的值
索引:t[2,3]:第3行第4列的值
2.如何给选取的行或者列赋值?
赋值:t[2:,3]=3 把从第3行开始,第4列赋值为3
3.如何大于把大于10的值替换为10?
布尔索引 t[t>10]=10
4.np.where如何使用?
三元运算符 t=np.where(t>10,20,0) 把t中大于10的替换为20,其他的替换为0
5.np.clip如何使用?
裁剪 t=t.clip(10,20) 把t中小于10的替换为10,大于20的替换为20
6.如何转置(交换轴)?
转置 ①t.T ②t.transpose() ③t.swapaxes()
7.读取和保存数据为csv
dtype:数据类型 delimiter:字符分割符
读取本地文件 np.loadtxt(file_path,delimiter,dtype)
8.np.nan和np.inf是什么
nan:不是一个数字
_number_nan = np.count_nonzero(t!=t) #统计t中nan的个数
nan的性质:np.nan!=np.nan
np.isnan(t) #统计t中哪些为nan,返回布尔值,效果和np.nan!=np.nan相同
t[np.isnan(t)]=1 #把t中为nan的替换为1
inf表示无穷
9.常用的统计函数你记得几个?
求和:t.sum(axis=0) #axis计算每列的值,每行第一个数的和,每行第二个数的和...所以为求列的和
求均值:t.mean(axis=0)
求中位数:np.median(t,axis=0)
最值:t.max(),t.min()
计算极差(最大-最小):np.ptp(t,axis=0)
计算标准差:t.std
10.标准差反映出数据的什么信息
反映数据的离散程度,稳定程度
练习:
①英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图
②希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图(散点图)
【操作】:
#coding=utf-8 |
结果:
【操作】
#coding=utf-8 |
结果:
数组的拼接
现在我希望把之前案例中两个国家的数据方法一起来研究分析,那么应该怎么做?
np.vstack((t1,t2)) 竖直拼接 np.hstack((t1,t2)) 水平拼接
(竖直分割和水平分割与拼接为互逆)
数组的行列交换
数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?
竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴
如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同
那么问题来了?
如何交换某个数组的行或者列呢?
练习:现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办
【操作】
#coding=utf-8 |
结果:
[[4394029 320053 5931 46245 0]
[7860119 185853 26679 0 0]
[5845909 576597 39774 170708 0]
...
[ 109222 4840 35 212 1]
[ 626223 22962 532 1559 1]
[ 99228 1699 23 135 1]]
numpy更多好用的方法
1.获取最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
【示例】
#coding=utf-8 |
结果:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
[0 1 2 3] ——>最大值的位置
[[-1. 0. 0. 0.]
[ 0. -1. 0. 0.]
[ 0. 0. -1. 0.]
[ 0. 0. 0. -1.]]
[0 1 2 3] ——>最小值的位置
2.创建一个全0的数组: np.zeros((3,4))
3.创建一个全1的数组:np.ones((3,4))
4.创建一个对角线为1的正方形数组(方阵):np.eye(3)
【示例】
#coding=utf-8 |
结果:
[[1. 1. 1.]
[1. 1. 1.]]
-------
[[0. 0. 0.]
[0. 0. 0.]]
-------
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
numpy生成随机数
【示例】np.random.rand()
#coding=utf-8 |
结果:
0.18760242455098486
[0.65982013]
[[0.52775828 0.84049786]
[0.89130358 0.71245619]]
【示例】randint,uniform
#coding=utf-8 |
结果:
[[15 13 19 0]
[ 6 10 2 17]
[ 3 4 18 19]]
[4.59312834 9.60812837 2.73907317 9.21329994 5.75528342]
【示例】seed():使得每次生成的随机数都一样
#coding=utf-8 |
结果:
[[ 9 4 15 0]
[17 16 17 8]
[ 9 0 10 8]]
分布的补充
均匀分布:在相同的大小范围内的出现概率是等可能的
正态分布:呈钟型,两头低,中间高,左右对称(平均数为0)