在数据科学领域有5个最佳的Python库,分别是NumPy、Scipy、Pandas、Matplotlib和Scikit-learn,本篇先讲解NumPy的相关知识。
NumPy简介
NumPy(Numerical Python
的简称)是Python的开源数值计算扩展库,是高性能科学计算和数据分析的基础包。它可用来存储和处理大型矩阵,比Python自身的嵌套列表nested list structure
结构要高效的多(它也可以用来表示矩阵matrix
)。
NumPy之所以可实现科学计算,是因为NumPy包括以下5部分内容:
-
具有矢量运算和复杂广播快速且节省空间的N维数组对象ndarray
-
用于读写磁盘数据及操作内存映射文件的工具
-
较为成熟的标准数据函数库
-
用于整合C/C++和Fortran代码的工具
-
实用的线性代数、傅里叶变换和随机数生成函数
NumPy在数据分析等数据科学领域应用广泛,主要原因如下:
-
强大的N维数组(矩阵)对象,非常快速高效,可实现矢量数学运算
-
高效的Index,不需要循环,提高效率,缩短了时间
-
免费开源并可跨平台使用,其运行效率可与C/Matlab媲美
数组的创建
NumPy中最重要、使用频率最高的是N维数组对象,利用此对象可对整块数据执行一些数学运算,本节主要讲解该数组对象的创建及访问。
NumPy中数组创建方法有多种,具体如下表所示。
函数名 | 功能说明 |
---|---|
array | 将输入数据(列表、元组、数组或其他序列类型)装换为ndarry,可显示指定dtype,默认直接复制输入数据 |
asarray | 将输入转换为ndarry,如果输入本身就是一个ndarry则不进行复制 |
arange | 类似于内置的range函数,但返回的是一个ndarry而不是列表 |
ones、ones_like | 根据指定的形状和dtype创建一个全1数组,ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1数组 |
zeros、zeros_like | 类似于ones和ones_like,只不过创建的是一个全0数组 |
empty、empty_like | 创建新数组,只分配内存空间但不填充任何值 |
eye、identity | 创建一个N×N并且对角线全为1,其余为0的数组 |
上表是NumPy中创建数组的函数说明,接下来将展示部分函数的使用及效果,具体如下所示:
- 使用array()函数直接创建,具体示例如下所示:
In [1]: import numpy as np
In [2]: array1 = np.array([1,2,3,4,5])
In [3]: lst = [1,2,3,4,5]
In [4]: array2 = np.array(lst)
In [5]: lst1 = [6,7,8,9,10]
In [6]: array3 = np.array([lst,lst1])
上述代码创建了3个数组array1、array2和array3,其中array1和array2是一维数组,运行结果如下所示:
In [7]: array1
Out[7]: array([1, 2, 3, 4, 5])
In [8]: array2
Out[8]: array([1, 2, 3, 4, 5])
数组array3是二维数组,运行结果如下所示:
In [9]: array3
Out[9]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
- 使用arange(start,end,step)函数创建,其中参数start是起始值,end是终止值,step是步长,最终返回一个array对象,具体示例如下所示:
In [10]: import numpy as np
In [11]: array4 = np.arange(1,10)
In [12]: array5 = np.arange(1,10,2)
In [13]: array6 = np.arange(1,10).reshape(3,3)
上述代码创建了3个数组array4、array5和array6,其中In [13]的reshape(3,3)函数是将生成的一维数组转换为拥有3行3列的二维数组,上述示例中各数组的运行结果如下所示:
In [14]: array4
Out[14]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [15]: array5
Out[15]: array([1, 3, 5, 7, 9])
In [16]: array6
Out[16]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
- ones()和zeros()函数,二者是返回全1或全0数组,具体示例如下所示:
In [20]: import numpy as np
In [21]: array10 = np.ones([2,4])
In [22]: array11 = np.zeros([2,4])
上述代码创建了2个数组array10和array11,其中In [21]是生成一个2行4列的全1数组并赋值给array10;In [22]是生成一个2行4列的全0数组并赋值给array11;上述示例中各数组运行结果如下所示:
In [23]: array10
Out[23]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
In [24]: array11
Out[24]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
- eye()函数,创建并返回一个对角线为1,其余为0的数组,具体示例如下所示:
In [17]: import numpy as np
In [18]: array12 = np.eye(4)
In [19]: array13 = np.eye(3)
上述代码创建了两个数组array12和array13,其中In [18]是创建了一个4×4的对角线为1,其余为0的数组并赋值给array12;In [19]是创建了一个3×3的对角线为1,其余为0的数组并赋值给array13;上述示例中各数组运行结果如下所示:
In [25]: array12
Out[25]:
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
In [26]: array13
Out[26]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
上述4种是较为基础并常见的创建数组的方式,但是除了上述4种还可以通过随机数来快速创建符合某些特质的数组,具体示例如下所示:
In [27]: import numpy as np
In [28]: array7 = np.random.randn(5)
In [29]: array8 = np.random.randint(10,size=(3,3))
In [30]: array9 = np.random.randint(10,size=9).reshape(3,3)
上述代码创建了3个数组array7、array8和array9,其中In [28]是随机生成含有5个符合正态分布值的数组并赋值给array7;In [29]是随机生成一个3行3列并且所有元素均为10以内整数的数组并赋值给array8;In [30]中reshape(3,3)是将生成的由9个10以内的整数组成数组转换为3行3列的数组,并赋值给array9;上述示例中各数组的运行结果如下所示:
In [32]: array7
Out[32]: array([-0.66070016,0.74529797,1.81593755,0.25059274, -0.27814649])
In [33]: array8
Out[33]:
array([[5, 3, 1],
[6, 7, 7],
[4, 9, 2]])
In [34]: array9
Out[34]:
array([[4, 0, 0],
[1, 4, 3],
[4, 6, 4]])
网友评论