numpy
什么是numpy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
创建一个数组
numpy中常见的更多数据类型
数据类型操作
t4=np.array(range(1,4),dtype=float)
t4
t4.dtype
#numpy中的bool类型
t5=np.array([1,1,0,1,0,0],dtype=bool)
t5
t5.dtype
#调整数据类型
t6=t5.astype("int8")
t6
import random
#numpy中的小数
t7=np.array([random.random() for i in range(10)])
t7
t7.dtype
t8=np.round(t7,2)
t8
数组形状
t1=np.arange(12)
t1
t1.shape#如果形状里面元组只有一个数,那么这个数表示一共有的个数
t2=np.array([[1,2,3],[4,5,6]])
t2
t2.shape
#三维数组
t3=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
t3
t3.shape
#修改数组形状
t4=np.arange(12)
t4
t4.reshape((3,4))
t5=np.arange(24).reshape((2,3,4))
t5
t5.reshape((4,6))#t5本身不发生变化
t5
t5.reshape((24,))
t6=t5.reshape((t5.shape[0]*t5.shape[1],))
t6
t5.flatten()
数组和数的计算
t5
t5+2
t5/0
数组和数组的计算
t6=np.arange(100,124).reshape((4,6))
t6
t6+t5
t6*t5
t7=np.arange(0,6)
t7
t5-t7
t8=np.arange(4).reshape(4,1)
t8
t5-t8
广播原则
怎么理解呢?
可以把维度指的是shape所对应的数字个数
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?
(3,3,3)是三块三行三列,所以不可以
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?
(3,3,2)是三块三行二列,所以可以。也可以和(3,3)计算
有什么好处呢?举个例子:每列的数据减去列的平均值的结果
轴(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个数据
数组的切片
numpy读取数据和存储数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量(["views","likes","dislikes","comment_total"])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作
数据来源:https://www.kaggle.com/datasnaek/youtube/data
import numpy as np
us_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\US_video_data_numbers.csv"
uk_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\GB_video_data_numbers.csv"
t1=np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)#unpack=True按对角线翻折一下行变成列
t1
t2=np.loadtxt(us_file_path,delimiter=",",dtype="int")
t2
那么,结合之前的所学的matplotlib把英国和美国的数据呈现出来
看到这个问题,我们应该考虑什么?
numpy中的转置
t2=np.arange(24).reshape((4,6))
t2
t2.transpose()
t2.T
t2.swapaxes(1,0)
numpy索引和切片
import numpy as np
us_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\US_video_data_numbers.csv"
uk_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\GB_video_data_numbers.csv"
t1=np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)#unpack=True按对角线翻折一下行变成列
t2=np.loadtxt(us_file_path,delimiter=",",dtype="int")
t2
#取行
t2[2]
#取连续的多行
t2[2:]
#取不连续的多行
t2[[2,8,10]]
#取列
t2[1,:]
t2[2:,:]
t2[[2,10,3],:]
t2[:,0]
#取连续多列
t2[:,2:]
#取不连续多列
t2[:,[0,2]]
#取多行多列
t2[2,3]
#取得是行和列交叉点的位置
t2[2:5,1:4]
#取多个不相邻的点,取[0,0],[2,1]
c=t2[[0,2],[0,1]]
c
numpy中的数值修改
修改行列的值,我们能够很容易的实现,但是如果条件更复杂呢?
比如我们想要把t中小于10的数字替换为3
t2[t2<10]=3
t2
numpy中的clip
小于10的替换为10,大于18的替换为了18,但是nan没有被替换,那么nan是什么?
将t2种的某一值替换为nan
t2=t2.astype(float)
t2[3,3]=np.nan
t2
数组拼接
数组的行列交换
现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办
import numpy as np
us_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\US_video_data_numbers.csv"
uk_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\GB_video_data_numbers.csv"
us_data=np.loadtxt(us_file_path,delimiter=",",dtype=int)
uk_data=np.loadtxt(uk_file_path,delimiter=",",dtype=int)
#添加国家信息
#构造全为0的数据
zeros_data=np.zeros((us_data.shape[0],1)).astype(int)
ones_data=np.ones((uk_data.shape[0],1)).astype(int)
us_data=np.hstack((us_data,zeros_data))
uk_data=np.hstack((uk_data,ones_data))
#拼接两组数据
final_data=np.vstack((us_data,uk_data))
numpy的注意点copy和view
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的注意点
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)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值
反映出数据的波动稳定情况,越大表示波动越大,越不稳定
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
那么问题来了:
如何计算一组数据的中值或者是均值
如何删除有缺失数据的那一行(列)[在pandas中介绍]
动手
import numpy as np
from matplotlib import pyplot as plt
us_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\US_video_data_numbers.csv"
uk_file_path="E:\大三上\数据分析学习\数据分析资料\day03\code\youtube_video_data\\GB_video_data_numbers.csv"
t_us=np.loadtxt(us_file_path,delimiter=",",dtype=int)
t_uk=np.loadtxt(uk_file_path,delimiter=",",dtype=int)
t_us_comments=t_us[:,-1]
#选择1比5000小的数据
t_us_comments=t_us_comments[t_us_comments<=5000]
t_us_comments.max()
t_us_comments.min()
d=500
bin_nums=(t_us_comments.max()-t_us_comments.min())//d
#绘图
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums)
plt.show()
t_uk_comments=t_uk[:,-1]
t_uk_like=t_uk[:,1]
t_uk=t_uk[t_uk[:,1]<=500000]
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_like,t_uk_comments)
plt.show()