一旦提到数据分析,我想大家会不约而同地想到利用 Python 来编写相关的程序,Python 在数据分析方面的优势是得天独厚的。数据分析的一大特点就是数据量大,并且数据之间拥有一定的结构关联。 比如说我们爬取电影数据,那么每部电影都会有名称、简介、演员、时长、评论等信息,这时候我们可以使用列表、字典等数据结构来存储。
-
当我们使用
列表
来存储时,我们只能使用下标来进行取值,要想准确地查找某一个数据,要么遍历,要么记住下标,显然前者浪费性能,后者更是天方夜谭。 -
当我们使用
字典
来遍历时,利用名称、简介等列名来查找对应的数据,例如利用字典的键去获取值。当我们要查找一部电影的全部数据,也就是一行数据,这又变得困难了起来。
可以看出,不管哪一种存储方式,都存在显示不明显、操作不方便的问题。
这对于一生要强的 Python 程序员是不可接受的,于是开发出了方便又快捷的 NumPy。NumPy 是处理层次性、结构性数据的一把利剑,利用 NumPy 我们不仅可以完成一维数组平均数、方差等统计操作,还可以进行四则运算的算术操作,对于多维数组的运算更是游刃有余。
接下来,让我们开启 Numpy 的学习之旅吧。
NumPy 是什么?
NumPy 也就是 "Numeric Python",它是 Python 进行数值计算的一个类库
,用来计算、处理高阶矩阵和数组。和 Math、Time 库一样,NumPy 是 Python 中的一个扩展库,提供了 Python 原生所不具备的多维数组对象(类似生活中使用的表格)。另外,NumPy 还有线性代数中的矩阵运算功能等,这为科研和实际工作都带来了不少的便捷。
NumPy 是由 Numeric 程序包发展而来的,从其诞生至今仍在不断扩展完善。如今,它在全球范围内被广泛使用,成为众多程序员的心头爱。除了设计者的奇思妙想之外,很大程度上是因为 NumPy 作为一个开源项目,它由许多协作者共同开发维护。
学习 NumPy,我们主要领悟面向数组编程的方法与思维。NumPy 的核心利器 ndarray------多维数组对象,对于常见的数组、矩阵都有着较好的适配性。这能为我们解决日常生活中常见的表格、矩阵数据提供较为适合的工具。NumPy 广泛应用在逻辑处理、科学计算、图像处理、数据分析、人工智能等场景。NumPy 是数据计算领域的核心库,可以对 Pandas、Intake、PyJanitor 提取、转换和加载,也可以配合 Jupyter、Seaborn、Matplotlib、Altair 使用。
NumPy 的优势有哪些?
NumPy 能够在科学计算领域得到广泛的运用,有着丰富的应用生态,肯定有着它的优势,下面我们就来看看 NumPy 的优势是什么。
1. 代码简洁
NumPy 是基于 C 语言编写的 Python 程序,可以调用很多 C 语言的 API,这就意味着其有着较强的计算能力,同时 Python 编写的程序也是比其他编程语言更加简洁易懂。
例如,我们有一个水果店的价格表,现在由于房租上涨,每个水果的价格要上涨一元,利用传统列表方式一定是利用多重循环的方式遍历每一个数据项。而 NumPy 不同,NumPy 对于 n 维数据的计算方式都是一样的,利用一行指令即可对所有数据进行遍历。
下面我们来比较一下利用 Python 循环的方式处理数据和利用 Numpy 处理数据,究竟哪种方法的代码更为简洁吧!水果价格展示如下:
苹果 | 草莓 | 西瓜 | 荔枝 |
---|---|---|---|
5 | 4 | 6 | 2 |
首先,我们先利用 Python 自带的列表数据结构来存储水果价格数据,并通过循环的方式处理每一个数据。
Python
fruitPrice=[5,4,6,2]
for i in range(4):
fruitPrice[i]=fruitPrice[i]+1
print(fruitPrice)
输出结果:
Python
[6, 5, 7, 3]
这样做当然是没有问题的,但在编码时会有复杂繁琐的循环嵌套,这不太符合我们对简洁的需求。这时候,NumPy 便应运而生,利用 Python 代码对底层逻辑进行封装,将复杂的过程隐藏,实现这些操作时只需要调用相关的方法即可。
下面我们再来看看利用 NumPy 解决这个问题时编码是否更为简洁呢,代码示例如下:
Python
import numpy as np
fruitPrice=np.array([5 ,4,6,2])
fruitPrice=fruitPrice+1
print(fruitPrice)
可以看到,在利用 NumPy 的数组数据结构存储数据时,借助于 NumPy 的广播机制 ,我们可以直接对数组加 1,从而实现对所有数据加 1 的操作,进而避免了复杂的循环操作。
通过上述的对比不难发现,利用 NumPy 进行数据处理时的编码更为简洁。
2. 性能高效
从前面的时间复杂度上我们或许能看出一点性能上的优势,因为一个时间复杂度为 n*n
,一个为 1
,明显 NumPy 占据一些优势。
NumPy 在性能上的高效一方面体现在速度
上 ,因为 NumPy 底层采用编译性语言------C 语言
,C 语言在速度上的优势是其他高等语言所不能及的。
下面我们就分别使用 Numpy 和循环两种方法对一个数组的每一个数据求平方,探究 Numpy 是否有较好的数据处理效率,验证一下 NumPy 的速度究竟有多快。
代码示例:
Python
import numpy as np
import time
arr = np.random.rand(100000)
# 使用Numpy进行平方运算
start_time = time.time()
arr_squared = arr ** 2
print("Numpy平方运算时间:", time.time() - start_time)
# 使用循环进行平方运算
start_time = time.time()
arr_squared = []
for i in range(len(arr)):
arr_squared.append(arr[i] ** 2)
print("循环平方运算时间:", time.time() - start_time)
运行结果:
Python
Numpy平方运算时间: 0.0009624958038330078
循环平方运算时间: 0.024974822998046875
运算时间的对比图展示如下:
从以上结果我们可以看出,在进行数学运算或大量的数据操作时,Python 原生的 list 数据结构组织的数据的运行时间接近 NumPy 处理数据的 26 倍,并且这个数字还会随着数据量的加大而增加。由此不难看出,NumPy 多维数组在速度方面的优势。
Numpy 性能高效的优势除了体现在数据处理速度快外,还体现在存储效率
高效这个方面。ndarray 擅长处理高阶矩阵运算,这是因为 ndarray 要求所有数据都是同样的数据类型,数据在内存空间中占用的字节数一致,可以紧挨着排在一起,所以可以同时处理很多数据,可以节约很多内存空间。
这里,我们首先知道 list 中的数据类型可以不同,ndarray 元素中的数据类型要求一致,所以 ndarray 中的每个数据所占的内存空间是一样大小的,这样我们只需要为这些数据分配连续的内存空间,然后将头部地址记住,便可以根据数据大小和数据位置找到相应的数据。而 list 中的数据所占内存大小不一样,那么我们就需要为相应的数据寻找相应的内存空间,由于数据在内存中的地址没有规律性,则需要对每一个数据的地址进行记录。如下图所示:
list 数据结构在数据访问时,需要先查找存放数据的地址,然后再根据地址找到数据,一共两次跳转;而 ndarray 则只需要进行一次查找,所以 ndarray 的查找效率比 list 的更快。ndarray 只需要开辟一片空间来存储数据,而 list 需要多开辟一片内存来存储数据的地址,所以空间方面也节省得多。
3. 应用生态丰富
NumPy 会配合其他科学计算库进行一些数据存储组织的功能。
在实际项目开发中,读取文件时通常用 Pandas 库,数据处理和计算任务时调用 NumPy,将数据用 array 一维数组的形式从 Pandas 组织的数据中取出,这样做完全利用了 NumPy 在计算速度上的快速和内存空间上的节省。接着用 Matplotlib 库进行图形的绘制,Matplotlib 是 Python 的绘图库,它经常与 NumPy 一起使用,提供数据可视化的方案。
NumPy拥有强大的数学计算能力,像是一位高级数学家,能够进行各种高效的数学运算,使得数据处理变得灵活且高效。Pandas则是数据的得力助手,能够将数据整理得井井有条,为NumPy提供整齐划一的数据,让其施展计算能力更得心应手。
而Matplotlib则是数据可视化的大师,他可以将NumPy和Pandas处理好的数据变成绚丽多彩的图表,让数据以图像的形式展现出来,让数据变得更加直观有趣。
下面我们来看一个读取文件数据并绘制柱状图的案例,基于公司不定期的利润增长表,设置柱状图来更加直观地了解公司情况。
日期 | 数量 |
---|---|
1-Jan-20 | 0.7 |
8-Jan-20 | 0.5 |
15-Jan-20 | 0.4 |
22-Jan-20 | 0.3 |
29-Jan-20 | 0.8 |
5-Feb-20 | 0.2 |
12-Feb-20 | 0.1 |
19-Feb-20 | 0.6 |
26-Feb-20 | 0.5 |
4-Mar-20 | 0.5 |
Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体,防止matplotlib中文乱码
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
# 读取excel中的数据
df = pd.read_excel(r'C:\Users\数据.xlsx', names=['time', 'SSTA'])
# print(df)
X = df['time']
Y = df['SSTA']
c = 0.5
y_above = np.zeros(Y.shape[0])
y_below = np.zeros(Y.shape[0])
for i in range(Y.shape[0]):
if abs(Y[i]) >= c:
y_above[i] = Y[i]
else:
y_below[i] = Y[i]
# 设置色带,达到根据数据变色
# map_vir = plt.get_cmap(name='Paired')
# colors = map_vir(Y)
# 设置标题,格式
plt.tight_layout()
plt.title("气温数据图")
plt.xlabel("Time")
plt.xticks(rotation=60, fontsize=6)
plt.ylabel("SSTA")
plt.bar(X, y_above, width=5.0, color='red', label="Above average")
plt.bar(X, y_below, width=5.0, color='grey', label="below average")
# 其他线应该在画柱状图之后再画
plt.axhline(y=c, color='black', linestyle=':')
plt.savefig(r"C:\shares_bar.png")
print("柱状图生成成功!请在桌面查看")
绘制结果如下:
通过上面的例子,我们不难发现 NumPy 不仅可作为构建 Pandas 的基础,在很多时候 NumPy 还能配合着 Pandas 进行数据处理。
NumPy 的下载与安装
Numpy 库是 Python 的一个第三方库,需要使用 Python 进行调用。通常情况下,建议使用 Python 3.6 或更高版本
,因为这些版本的 Python 有更好的 Numpy 兼容性和性能优化。所以,在安装 NumPy 之前我们需要先安装好指定版本的 Python。
在这些都做好准备之后,我们就来一起学习如何安装 NumPy 这个科学计算库吧!
如果你是一位资深 Python 程序员,并且环境安装完好无误,那么恭喜你,你可以使用 pip install NumPy
这行简单的命令安装 NumPy。
如果遇到了 pip 下载速度过慢的话,这时需要改变一下 pip 下载源了,利用清华大学镜像下载,速度会得到不少的提升。
Python
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后我们可以看到这样一段话:
如果需要了解更加详细的 numpy 信息,可以输入:pip show numpy
,就可以获得如下图所示的信息:
通过 pip,我们还可以安装 jupyter notebook,这是一个 Python 网页版,包含了所有数据包。
Python
pip install jupyter notebook
如果我们下载成功,在 cmd 中输入 jupyter notebook
,会出现以下的提示,我们根据提示复制连接到浏览器,即可打开 jupyter notebook。
如果你对于 Python 不太熟悉,相关环境没有配置,那么你只需要安装 Anaconda ,下载地址为:www.anaconda.com/ 。它本身自带 Python 原生不具有的许多科学计算和可视化的包,在使用时不需要进行包的下载,并且它还支持多种常用系统,因此是初学者的不二之选。
安装成功之后,我们在 cmd 中输入 conda -version
,如果出现版本信息说明你安装成功了。
反正不论你选择以上哪一种方式下载安装 NumPy,都不会影响接下来你对 NumPy 的学习。
总结
学习 NumPy,首先要掌握 NumPy 的基本功能和使用方法,了解如何利用 NumPy 组织数据。接着应该学习 NumPy 优秀的设计思想,比如利用数据类型的限制而达到效率的提升,这不但有助于我们理解 NumPy,更加为我们今后对于编程设计提供优秀的思路。
学习 NumPy,重点养成面向数组编程的方式,避免多层循环,保持代码简洁。
本小册详细链接:juejin.cn/book/724073...