03

mac2024-05-08  42

python数据分析之numpy

1.什么是 numpy ?2. numpy 基础2.1 numpy 创建数组(矩阵)2.2 numpy 中常见的更多数据类型2.3 数据类型的操作2.4 数组的形状2.4 数组和数的计算2.5 广播原则2.6 轴(axis)2.7 numpy 读取数据2.8 numpy 中的转置2.9 numpy 索引和切片2.10 numpy 中数值的修改2.11 numpy 中的布尔索引2.12 numpy 中的三元运算2.13 numpy 中的clip(裁剪)2.14 numpy 中的nan和inf 3. numpy 中常用统计函数3.1 ndarry缺失值填充均值3.2 数组的拼接3.3 数组的行列交换3.4 numpy更多好用的方法3.5 numpy 生成随机数3.6 分布的补充3.7 numpy的注意点copy和view 上一篇: python数据分析之matplotlib 为什么要学习numpy numpy有三大优点:

快速方便科学计算的基础库

1.什么是 numpy ?

一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算

2. numpy 基础

2.1 numpy 创建数组(矩阵)

# coding=utf-8 import numpy as np import random # 使用numpy生成数组,得到ndarray的类型 t1 = np.array([1, 2, 3, ]) print(t1) print(type(t1)) t2 = np.array(range(10)) print(t2) print(type(t2)) t3 = np.arange(4, 10, 2) print(t3) print(type(t3)) print(t3.dtype) print("*" * 100) # numpy中的数据类型 t4 = np.array(range(1, 4), dtype="i1") print(t4) print(t4.dtype) # numpy中的bool类型 t5 = np.array([1, 1, 0, 1, 0, 0], dtype=bool) print(t5) print(t5.dtype) # 调整数据类型 t6 = t5.astype("int8") print(t6) print(t6.dtype) # numpy中的小数 t7 = np.array([random.random() for i in range(10)]) print(t7) print(t7.dtype) t8 = np.round(t7, 2) print(t8)

2.2 numpy 中常见的更多数据类型

常见的数据类型:int、float、string等等。

2.3 数据类型的操作

包括指定创建的数组的数据类型、修改数组的数据类型、修改浮点型的小数位数。 那么问题来了,python中如何保留固定位数的小数? 参考链接:https://blog.csdn.net/whjstudy1/article/details/79528720

2.4 数组的形状

主要包括:查看数组的形状**.shape**、修改数组形状**.reshape** 修改数组形状不会改变原来数组的形状

2.4 数组和数的计算

不同维度的数组是无法计算的,除非他们之间的行、列数有任意一个相同。

2.5 广播原则

怎么理解呢? 可以把维度指的是shape所对应的数字个数 那么问题来了: shape为(3,3,3)的数组能够和(3,2)的数组进行计算么? shape为(3,3,2)的数组能够和(3,2)的数组进行计算么? 有什么好处呢? 举个例子:每列的数据减去列的平均值的结果

2.6 轴(axis)

0 轴表示列索引,1 轴表示行索引

2.7 numpy 读取数据

CSV:Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的。

import numpy as np np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

参数说明

2.8 numpy 中的转置

转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据 以上的三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样

# coding=utf-8 import numpy as np ''' 转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也 是为了更方便的去处理数据 常用方法:transpose()、.T和swapaxes(1,0) ''' ''' # 转置的方法 t=np.arange(24).reshape(4,6) print(t) print(t.transpose()) print(t.T) print(t.swapaxes(1,0)) ''' 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, unpack=True) t2 = np.loadtxt(us_file_path, delimiter=",", dtype=int) # print(t1) print("*" * 100) print(t2) print("*" * 100) # 取行 print(t2[2]) # 取连续的多行 print("*" * 100) print(t2[2:]) # 取不连续的多行 print("*" * 100) print(t2[[2, 8, 10]]) # print(t2[1,:]) # print(t2[2:,:]) # print(t2[[2,10,3],:]) # 取列 print("*" * 100) print(t2[:, 0]) # 取连续的多列 print("*" * 100) print(t2[:, 2:]) # 取不连续的多列 print("*" * 100) print(t2[:, [0, 2]]) # 取行和列,取第3行,第四列的值 print("*" * 100) a = t2[2, 3] print(a) print(type(a)) # 取多行和多列,取第3行到第五行,第2列到第4列的结果 # 取的是行和列交叉点的位置 print("*" * 100) b = t2[2:5, 1:4] print(b) # 取多个不相邻的点 # 选出来的结果是(0,0) (2,1) (2,3) print("*" * 100) c = t2[[0, 2, 2], [0, 1, 3]] print(c)

练习 现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量([“views”,“likes”,“dislikes”,“comment_total”])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作

数据来源:https://www.kaggle.com/datasnaek/youtube/data

补充:对于复制一个目录到另外一个目录下的命令 :先切换到所需要目录,在输入命令:cd -rf 文件 . cp -rf ~/Documents/DataAnalysis/day03/code/youtube_video_data .

# coding="utf-8" ''' 现在希望把之前案例中两个国家的数据方法一起来研究分析, 同时保留国家的信息(每条数据的国家来源),应该怎么办 ''' import numpy as np us_data="./youtube_video_data/US_video_data_numbers.csv" uk_data="./youtube_video_data/GB_video_data_numbers.csv" # 1.加载国家数据 us_data = np.loadtxt(us_data,delimiter=",",dtype=int) uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int) print(us_data.shape[0],uk_data.shape[0]) ''' 1688 1600 ''' # 2.添加国家信息 # 构造全为0,1的数据 zeros_data=np.zeros((us_data.shape[0],1)).astype(int) ones_data=np.ones((uk_data.shape[0],1)).astype(int) # print(zeros_data) # 分别添加一列全为0,1的数组 us_data=np.hstack((us_data,zeros_data)) print(us_data) ''' [[4394029 320053 5931 46245 0] [7860119 185853 26679 0 0] [5845909 576597 39774 170708 0] ... [ 142463 4231 148 279 0] [2162240 41032 1384 4737 0] [ 515000 34727 195 4722 0]] ''' uk_data=np.hstack((uk_data,ones_data)) print(uk_data) ''' [[7426393 78240 13548 705 1] [ 494203 2651 1309 0 1] [ 142819 13119 151 1141 1] ... [ 109222 4840 35 212 1] [ 626223 22962 532 1559 1] [ 99228 1699 23 135 1]] ''' # 3.拼接两组数据 final_data=np.vstack((us_data,uk_data)) print(final_data) ''' [[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]] '''

那么,结合之前的所学的matplotlib把英国和美国的数据呈现出来?

看到这个问题,我们应该考虑什么?我们想要反映出什么样的结果,解决什么问题? 选择什么样的呈现方式?数据还需要做什么样的处理?写代码 # coding="utf-8" import numpy as np import matplotlib.pyplot as plt us_data="./youtube_video_data/US_video_data_numbers.csv" uk_data="./youtube_video_data/GB_video_data_numbers.csv" t_us = np.loadtxt(us_data,delimiter=",",dtype=int) # 取评论数 t_us_comments=t_us[:,-1] # 选择比5000小的数据 t_us_comments=t_us_comments[t_us_comments<5000] # 计算组数 d = 250 # 组距 bin_nums = (max(t_us_comments) - min(t_us_comments)) // d # 绘图 plt.figure(figsize=(20,8),dpi=80) plt.hist(t_us_comments,bin_nums,density=False) plt.savefig('./t_04.png') plt.show()

2.9 numpy 索引和切片

对于刚刚加载出来的数据,我如果只想选择其中的某一列(行)我们应该怎么做呢? 其实操作很简单,和python中列表的操作一样

2.10 numpy 中数值的修改

修改行列的值,我们能够很容易的实现,但是如果条件更复杂呢? 比如我们想要把t中小于10的数字替换为3

2.11 numpy 中的布尔索引

2.12 numpy 中的三元运算

2.13 numpy 中的clip(裁剪)

2.14 numpy 中的nan和inf

numpy中的nan的注意点

3. numpy 中常用统计函数

3.1 ndarry缺失值填充均值

学习要学会总结,看到这里你可以思考下列问题:

如何选择一行或者多行的数据(列)?如何给选取的行或者列赋值?如何大于把大于10的值替换为10?np.where如何使用?np.clip如何使用?如何转置(交换轴)?读取和保存数据为csvnp.nan和np.inf是什么常用的统计函数你记得几个?标准差反映出数据的什么信息 练习 英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图 希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图 # coding="utf-8" import numpy as np import matplotlib.pyplot as plt us_data="./youtube_video_data/US_video_data_numbers.csv" uk_data="./youtube_video_data/GB_video_data_numbers.csv" t_us = np.loadtxt(us_data,delimiter=",",dtype=int) # 取评论数 t_us_comments=t_us[:,-1] # 选择比5000小的数据 t_us_comments=t_us_comments[t_us_comments<5000] # 计算组数 d = 250 # 组距 bin_nums = (max(t_us_comments) - min(t_us_comments)) // d # 绘图 plt.figure(figsize=(20,8),dpi=80) plt.hist(t_us_comments,bin_nums,density=False) plt.savefig('./t_04.png') plt.show() # coding="utf-8" import numpy as np import matplotlib.pyplot as plt us_data = "./youtube_video_data/US_video_data_numbers.csv" uk_data = "./youtube_video_data/GB_video_data_numbers.csv" t_uk = np.loadtxt(uk_data, delimiter=",", dtype='int') #选择喜欢数比50万小的数据 t_uk=t_uk[t_uk[:,1]<500000] t_uk_comment=t_uk[:,-1] t_uk_like=t_uk[:,1] plt.figure(figsize=(20,8),dpi=80) plt.scatter(t_uk_like,t_uk_comment) plt.savefig('./t_05.png') plt.show()

3.2 数组的拼接

现在我希望把之前案例中两个国家的数据方法一起来研究分析,那么应该怎么做?

3.3 数组的行列交换

思考:现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办?

3.4 numpy更多好用的方法

获取最大值最小值的位置 np.argmax(t,axis=0)np.argmin(t,axis=1) 创建一个全0的数组: np.zeros((3,4))创建一个全1的数组:np.ones((3,4))创建一个对角线为1的正方形数组(方阵):np.eye(3)

3.5 numpy 生成随机数

3.6 分布的补充

3.7 numpy的注意点copy和view

下一篇:

最新回复(0)