首页 > 编程学习 > 拜师教育第一阶段day3_Python数据分析

拜师教育第一阶段day3_Python数据分析

发布时间:2022/5/14 18:56:47

第三章   numpy的使用

1.numpy的优势:方便、快捷、是科学计算的基础库,主要侧重对数值型数据的处理,一般用来处理大型、多维数组(数组array:列表、多个嵌套的列表、矩阵类型)的数值运算。

2.numpy的使用:

(1)numpy的导入与数组的创建:在使用numpy下的函数时,要在.py文件开头导入该包import numpy as np。可以通过a=np.array([0,1,2,3,4,5])创建一个一维数组,它等价于语句np.arange(6)和np.array(range(6)),值得说明的是,这里的arange()与range()一样均是“包头不包尾”的使用规则。在np.arange()中可以添加步长(但在其中添加步长参数时要补全其余各参数,包括起始值、终止值、步长),也可以通过dtype=int指定创建元素的类型为“int”。

(2)数组的类型与数组中数据的类型:通过type(a)获得数组的类型为numpy.ndarray,通过a.dtype这个属性(是属性,不需要加())获得数组a中元素的类型。

numpy中常用数据类型表:

(3)数据类型的操作:可以在创建时指定元素的数据类型a=np.array([1,0,1,0,1,0],dtype='bool')此时创建的类表中只包含布尔量(True、False)。若数据并非通过创建获得,则对已存在的数组进行修改元素类型的操作为b=a.astype('float'),不过这个函数存在返回值,即并非对原数组进行修改,所以常需要对数组的修改结果进行接收。另外,可以通过np.round(b,2)将数组b的浮点型元素修改为只保留两位小数。

(4)数组的形状(块数、行数、列数):可以通过a.shape这个属性返回数组a的形状(以元组进行表示,其中元组中有几个数字就对应数组是几维度)。当为一维时,返回数字代表个数,当为二维时,返回的元组代表矩阵的行数和列数,当为三维时,返回的三个数字分别对应数组的块数,每块中矩阵的行数和列数。通过元组中返回的数字可以计算构成元组总共需要的元素的数目为数组中各数字的乘积。通过a.reshape(行数,列数)可以在不改变原数组的情况下,生成指定行数和列数的新数组。可以通过a.flatten()将数组转换为一维数组。

(5)数组与数、数组与数组的计算:数组与一个数字进行加、减、乘、除运算是将其中包含的每个元素进行相应的四则运算。这里需要补充说明的是,numpy数组中一个数字除以零返回的是inf(无穷大),零元素除以0返回的是nan(not a number)。对于相同形状的两个数组,进行四则运算时只需要按照对应位置进行四则运算即可(故这里的数组乘除法并非矩阵的乘法与除法,要注意区分)。

(插入说明):广播原则:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或者其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和长度为1的维度上进行。(个人理解:就是看两个数组.shape()的返回值从后往前看是否都一致,长短可以不同,但短的维度的那个元组的形状从后往前的维度数字到结束要与长度的都对应。比如shape为(3,3,3)的数组不能够和(3,2)的数组进行计算,shape为(3,3,2)的数组能够和(3,2)的数组进行计算)。(但对于shape为(3,3,3)的数组也能够和(3,)的数组进行计算。)

(补充说明):轴对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴。

 

(6)读取文本类(如.txt和.csv文件等)文件:语句为np.loadtxt(fname(文件的路径),dtype=np.float,delimiter=None,skiprows=0(0代表第一行),usecols=None,unpack=False(若为True则读入后的数组的行列与原文件中数组的行列互相转置))。在读取时遇到较小或者较大的数,loadtxt指令会默认格式为科学计数法,所以常常需要设置类型参数dtype。其中各参数的规定如下表:

(7)转置:numpy中有两种转置方法与一种轴交换方法都可以达到行列互换的效果:t.transpose(),t.T没有括号,t.swapaxes(1,0)。

(8)切片与索引:取某一行所有的列a[i,:],取以步长为j的连续的多行所有列a[i:i+k:j,:],取不连续多行i,q,z行的所有列a[[i,q,z],:]。取所有的行的某一列a[:,i],取所有行的以步长为j的连续的多列a[:,i:i+k:j],取所有行的不连续多列i,q,z列a[:,[i,q,z]]。取第i到j行、第m到n列的所有元素a[i:j+1,m:n+1](这里要注意切片的包头不包尾原则)。索引某行某列的元素a[i,j]。通过type()可以发现这里的元素是numpy.int32类并非python中的普通int类。最后,我们可以通过a[[i,m],[j,n]]这种方式取得多个不连续的点(i,j),(m,n)。

(9)numpy中数值的修改:直接取出赋值修改即可,例如想要将所有行的第二列到第三列的元素修改为0→a[:,2:4]=0。可以通过bool索引(不产生新数组,操作原数组)a[a<10]=10将数组a中所有小于10的元素替换为10,还可以通过三元运算符(产生新数组对象)np.where(a<10,0,20)将所有小于10的元素修改为0,所有大于等于10的元素替换为20。还可以通过裁剪操作将小于10的元素替换为10,大于15的元素替换为15→a.clip(10,15)。

如何强行把a数组中的第三行第三列的元素替换为NAN?首先要查看数组a是否为浮点型(原因是nan为浮点型),如果不是通过a.astype('float')将其替换为浮点型。再取出该位置的数值,赋值修改a[3,3]=np.nan即可。

(10)数组的拼接:竖直拼接np.vstack((t1,t2)),水平拼接np.hstack((t1,t2)),其中竖直分割与竖直拼接互为逆过程(划横线),也就说怎么拼接的便怎么分割。

(11)数组的行列交换:数组在进行竖直拼接前,要保证两个数组的列数相同,且每列代表的含义相同,因此在竖直拼接前如果每一列的意义不同要交换其中某组数组的列,使其和另外的数组的列含义一致。可以通过a[:,[1,2]]=a[:,[2,1]]进行列交换,还可以通过a[[1,2],:]=a[[2,1],:]进行行交换。

(12)利用numpy生成随机数(使用前应先导入from numpy import random):

(补充说明):np.random.seed(s);np.random.randint();操作每次运行产生的随机数相同。

(13)其他操作:获取最大值最小值的位置:np.argmax(t,axis=0)、np.argmin(t,axis=1);创建一个shape为(3,4)的全0数组: np.zeros((3,4));创建一个shape为(3,4)的全1数组:np.ones((3,4));创建一个对角线为1的3×3方阵:np.eye(3)。

3.numpy中的nan与inf:nan(NAN,Nan):not a number表示不是一个数字。当我们读取本地的文件为float的时候,如果有缺失,就会出现nan。当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大),也会出现nan。inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷。当一个数字除以0(python中直接会报错,numpy中是一个inf或者-inf)的时候,就会出现inf。需要注意的是,nan与inf均为浮点型。numpy中的nan使用时要注意以下各点:

将数组中为nan的元素替换成零有何不妥?全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行(但是如果该表中某行或者某列只含有一个nan,若直接将该行或者该列删除,则大部分有效数据也会随之被删除)。

4.numpy中常用统计函数:求和a.sum(),均值a.mean(),中值np.median(),最大值a.max(),最小值a.min(),极差np.ptp(),标准差a.std(),默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果(即沿着轴的方向取垂直于轴的内容的函数的值)。标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,约不稳定。需要注意的点如下:

5.两种常见的分布:均匀分布(在相同的大小范围内的出现概率是等可能的);正态分布(呈钟型,两头低,中间高,左右对称)。

6.作业:实现如下操作:(1)根据英国的youtube1000的数据结合matplotlib绘制出评论数量的直方图,如果希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制该图?(2)如果希望把两个国家的数据放到一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办?(提示:来自英国的数据置为0,来自美国的数据置为1。)

# -*- coding:utf-8 -*-
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(12,4),dpi=80)
uk_data=np.loadtxt("./gb_videos_data_numbers.csv",delimiter=",",dtype="int")
uk_comment=uk_data[:,-1]
uk_comment=uk_comment[uk_comment<8000]
d=320
nums_bins=np.ptp(uk_comment)//d
plt.hist(uk_comment,nums_bins,color='orange')
plt.grid(alpha=0.5)
plt.xticks(range(0,8320,320))
plt.show()
# -*- coding:utf-8 -*-
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:\WINDOWS\FONTS\SIMHEI.TTF")
plt.figure(figsize=(6,4),dpi=80)
uk_data=np.loadtxt("./gb_videos_data_numbers.csv",delimiter=",",dtype="int")
uk_data=uk_data[uk_data[:,1]<=100000]
uk_data=uk_data[uk_data[:,-1]<=20000]
uk_like=uk_data[:,1]
uk_comment=uk_data[:,-1]
#uk_comment=uk_comment[uk_comment<8000
plt.scatter(uk_like,uk_comment,color='orange')
x_ticks=["{0}人次".format(i) for i in range(0,120000,20000)]
plt.xticks(range(0,120000,20000),x_ticks,fontproperties=my_font)
y_ticks=["{0}人次".format(i) for i in range(0,24000,4000)]
plt.yticks(range(0,24000,4000),y_ticks,fontproperties=my_font)
plt.grid(alpha=0.5)
plt.xlabel("喜爱人次",fontproperties=my_font);
plt.ylabel("评论人次",fontproperties=my_font)
plt.title("评论人次随喜爱人次变化趋势",fontproperties=my_font)
plt.show()
t1=np.zeros((uk_data.shape[0],1),dtype=int)
t2=np.hstack((uk_data,t1))
print(t2)

 

 

 

Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000