赞
踩
NumPy是SciPy家族的成员之一。
SciPy家族是一个专门应用于数学、科学和工程领域的开源Python生态圈,或者说是一个由多个Python库组成的集合,用于解决科学计算中的各种问题。这些库构成了一个功能强大的科学计算工具箱,可以进行数值计算、优化、信号处理、统计分析、线性代数等各种操作。
以下是SciPy家族的一些主要成员:
NumPy: NumPy是SciPy的核心库,提供了多维数组对象和各种操作数组的函数。它是Python科学计算的基础,可以进行高效的数值计算。
SciPy: SciPy是一个用于科学计算的库,提供了许多高级的数学算法和工具。其中包括插值、积分、优化、信号处理、线性代数、统计分析等功能。
Matplotlib: Matplotlib是一个用于绘制二维图形的库。它可以生成各种类型的图形,包括线图、散点图、柱状图等。Matplotlib与NumPy和SciPy配合使用,可以方便地可视化科学数据。
Pandas: Pandas是一个用于数据处理和分析的库。它提供了高级数据结构,如DataFrame和Series,可以方便地处理和操作数据。
SymPy: SymPy是一个用于符号计算的库。它可以进行代数计算、微积分、方程求解等操作,是一个强大的数学工具。
Scikit-learn: Scikit-learn是一个用于机器学习的库。它实现了许多常用的机器学习算法和工具,包括分类、回归、聚类等。
SciPy Lecture Notes: SciPy Lecture Notes是一份关于SciPy家族的教程和指南。它提供了详细的介绍和示例,帮助用户学习和使用这些库。
这些成员共同构成了SciPy家族,提供了丰富的科学计算功能和工具,广泛应用于科学研究、工程计算、数据分析等领域。
SciPy家族的核心成员为Matplotlib、SciPy和NumPy,可以概括为MSN这三个字母。
NumPy的核心是多维数组类numpy.ndarray,矩阵类numpy.matrix是多维数组类的派生类,以多维数组类为数据组织结构,NumPy提供了众多的数学、科学和工程函数,此外,NumPy还提供了以下多个子模块:
numpy.random:随机抽样子模块。
numpy.linalg:线性代数子模块。
numpy.fft:傅里叶变换子模块。
numpy.ctypeslib:C-Types外部函数接口子模块。
numpy.emath:具有自动域的数学函数子模块。
numpy.testing:测试支持子模块。
numpy.matlib:矩阵库子模块。
numpy.dual:SciPy加速支持子模块。
numpy.distutils:打包子模块
咱们这篇演绎还是基于Jupyter Notebook,第一次看到这里的小伙伴参考我的这两篇文章构建环境:
(Windows系统)
启动虚拟环境:
NumPy提供了一个高性能的多维数组对象,并且包含了许多用于操作这些数组的函数。
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
NumPy数组具有许多有用的属性和方法。
- a = np.array([1, 2, 3])
- print(a.shape)
形状:
维度:
数据类型:
数组属性:
可以使用切片操作或者索引操作来访问和修改数组元素。
- a = np.array([1, 2, 3, 4, 5])
- print(a[2:4])
- b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
- print(b[1, 2])
同时,NumPy数组可以进行各种数学运算,并且支持广播(broadcasting)机制,使得对不同形状的数组进行运算变得非常方便。
可以对数组进行逐元素的加减乘除运算,也可以与标量进行运算。
- a = np.array([1, 2, 3])
- b = np.array([4, 5, 6])
- c = a + b
- d = a * 2
- print(c)
- print(d)
执行如下:
通过NumPy库提供的dot()函数可以进行矩阵的乘法运算。
- a = np.array([[1, 2], [3, 4]])
- b = np.array([[5, 6], [7, 8]])
- c = np.dot(a, b)
- print(c)
执行如下:
这里,给小伙伴们罗嗦一下这个点积的计算:
上面点积结果矩阵中左上角19的计算:
1 × 5 + 2 × 7 = 19
右上角22的计算:
1 × 6 + 2 × 8 = 22
左下角43的计算:
3 × 5 + 4 × 7 = 43
右下角50的计算:
3 × 6 + 4 × 8 = 50
咱们先准备一个数组:
- a = np.arange(6)
- a
- a.shape
- a.dtype
现在咱们改变数组结构:
- a = a.reshape((2,3))
- a
现在咱们改变数据类型:
- a = a.astype(np.float64)
- a.dtype
维,就是维度。通常说数组是几维的,就是指维度数,如三维数组的维度数就是3。
维度数还有一个专用名字,即秩,也就是数组属性ndim。秩这个名字感觉有些多余,不如维度数更容易理解。
轴,简单来说,我们可以把数组的轴和笛卡儿坐标系的轴来对应一下:
一维数组,类比于一维空间,只有一个轴,那就是0轴。
二维数组,类比于二维空间,有两个轴,习惯表示成行和列,行的方向是0轴,列的方向是1轴。
三维数组,类比于三维空间,有三个轴,习惯表示成层、行和列,层的方向是0轴,行的方向是1轴,列的方向是2轴。
接下来咱们用一个三维数组求总和与分层求和的例子来演示一下轴概念的重要性,我们知道,列表求和需要使用Python内置的求和函数sum( ),且只能对数值型的一维列表求和,而数组则是自带求和方法,且支持按指定轴的方向求和:
# array([15, 51, 87]) >>> # 分层求和方法2 array([15, 51, 87])
下面是:3层2行3列的结构
- a = np.arange(18).reshape((3,2,3))
- a
计算全部数组元素之和:
0轴方向求和(3层合并成1层,返回二维数组):
1轴方向求和(2行合并成1行,返回二维数组):
2轴方向求和(3列合并成1列,返回二维数组):
一种分层求和方法:
a.sum(axis=1).sum(axis=1)
另一种分层求和方法:
a.sum(axis=2).sum(axis=1)
NumPy数组具有极高的、接近C语言的运行效率,处理速度远比Python列表快得多。
为什么Numpy对数组比列表的处理速度快呢?
原来,ndarray拥有区别于列表的两大“独门绝技”:广播(broadcast)和矢量化(vectorization)
广播可以理解为隐式地对每个元素实施操作;矢量化可以理解为代码中没有显式的循环、索引等。
广播和矢量化对于初学者而言有点抽象,咱们用两个例子来说明一下:
示例一:数值型数组的各个元素加1
使用Python列表实现列表的各个元素加1,似乎除了循环就没有更好的办法,当然,用map( )函数来实现也可以,但这个方法只是避免显式地使用循环,实际处理速度不会比循环更快。
像这样:
- a = [0, 1, 2, 3, 4]
- for i in range(len(a)):
- a[i] += 1
如果换成NumPy数组,利用其广播特性,无须循环就可以实现对数组每一个元素加1的操作,如下:
- a = np.array([0, 1, 2, 3, 4])
- a += 1
- a
数组的广播特性,不仅省略了循环结构,更重要的是可以大幅度加快数据的处理速度。
示例二:两个等长的数值型数组的对应元素相加
如果两个等长的Python列表对应元素相加,需要同时遍历两个列表,下面使用zip( )函数,辅以列表推导式,实现两个等长Python列表的对应元素相加,当然,这种运行效率并不高:
- a = [0, 1, 2, 3, 4]
- b = [5, 6, 7, 8, 9]
- [i+j for i, j in zip(a, b)]
如果换成NumPy数组,利用其矢量化特性来实现两个数组对应元素相加,就像是进行两个整型变量相加,其代码如下:
- a = np.array([0, 1, 2, 3, 4])
- b = np.array([5, 6, 7, 8, 9])
- a + b
以上两个例子分别用列表和数组的方式给出了答案:显然,用NumPy数组实现起来要比用Python列表更直观、更简洁,这正是得益于NumPy的两大特性:广播和矢量化。
广播和矢量化是NumPy最核心的特性之一,是NumPy的本质。
广播和矢量化体现在代码上则有以下几个特点:
1)矢量化代码更简洁,更易于阅读;
2)代码行越少意味着出错的概率越小;
3)代码更接近标准的数学符号;
4)矢量化代码更符合Python之禅。
好啦,这一篇就到这里,咱们暂时先告一段落,毕竟:那啥不是一天建成的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。