NumPy是Python做数据处理的底层库,是高性能科学计算和数据分析的基础,比如著名的Python机器学习库SKlearn就需要NumPy的支持。掌握NumPy的基础数据处理能力是利用Python做数据运算及机器学习的基础。
NumPy(或简称NP)的主要功能特性如下:
- 具有数组(ndarray)能力,这是一个具有矢量算术运算和复杂广播的快速且节省空间的多维数组。
- 用于对整租数据进行快速运算的标准数学函数(代替循环实现)。
- 可用于读写数据以及操作内存映射文件。
- 具有线性代数、随机数生成以及傅里叶交换功能。
- 可集成C、C++、Fortran等语言,提供了简单易用的C API,很容易将数据传递给低级语言编写的外部库,也能以NumPy数组的形式将数据返回给Python。
NumPy本身没有多么高级的数据分析能力,但理解NumPy数组以及面向数组的操作会有利于理解之后讲到的Pandas(Python的另一个数据分析库),也有助于自己利用Python编写机器学习或深度学习算法,甚至也是日后应用Sklearn的基础。
对于NumPy而言,它的实际应用会侧重于以下几点:
- 数据读取或生成,尽管它本身这方面的能力不强,但偶尔也可以使用。
- 数据合并、清洗、过滤、转换等数组操作。
- 常用的数组算法应用,例如排序、唯一化、集合运算等。
- 数据描述性统计以及数据聚合或摘要运算。
- 用于易购数据的合并、连接运算的数据对齐和关系型数据运算。
- 利用数组表达式代替条件逻辑表达式(if-else)
NumPy基础
NumPy操作的对象是N维数组,称为ndarray,大多数情况下都叫做数组。我们先来看一个N维数组:
>>> import NumPy as np
>>> data = np.arange(15).reshape(3, 5)
>>> print (data)
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]
先忽略上面的代码语法,我们只看data,它就是一个3行5列的数组对象。既然是对象,一定有属性,NumPy中数组的属性常用属性如下:
ndarray.ndim。数组轴的个数,在python的世界中,轴的个数被称作秩。如上面我们构建的数组data的轴的个数为2。轴的概念和平面图形里面的X轴、Y轴是一个概念,2个轴代表该数组是二维数据。
>>> print (data.ndim)
2
ndarray.shape。数组的矩阵形状。这是一个指示数组在每个维度上大小的整数元组。如上面的data数组,每个轴的矩阵形状都是3行5列。
>>> print (data.shape)
(3, 5)
ndarray.size。数组元素的总个数,等于shape属性中元组元素的乘积。如上面的data数组中元素的总个数为15。
>>> print (data.size)
15
ndarray.dtype。一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型。如上面的data数组的对象类型为int32.
>>> print (data.dtype)
int32
除此以外,数组ndarray还有其他属性,例如用于表示每个元素字节数的itemsize,白哦是实际数组缓冲区的data属性等,但这些都应用不多。
NumPy的数据类型。不要为了记忆NumPy的dtypes而烦恼,尤其当你是一个新用户。通常只需要关心普通的数据类型即可(浮点、复数、整形、布尔型、字符串)。 当你需要更多的控制数据如何存储到内存和磁盘,特别是大的数据集时,知道你所控制的存储类型是很有必要的。
ndarray的数据类型语法为:
#指定数组类型为int16
>>> int16_arr = np.array( [1, 2, 3], dtype = np.int16)
>>> print int16_arr
[1, 2, 3]
#指定数组类型为float64
>>> float64_arr = np.array( [1, 2, 3], dtype = np.float64)
>>> print float64_arr
[ 1. , 2. , 3. ]
创建NumPy数组
创建NumPy数组有几种形式。
第一种,假如已经有了数组表达式或值,这通常来源于前期数据导入代码或者其他库,在这里只需要将其转换成NumPy数组即可。如下列代码,a为列表,通过np.array()将其转换为NumPy的ndarray类型。
>>> a = [[1,2,3],[4,5,6]
>>> a2 = np.array(a)
>>> print (type(a2))
NumPy.ndarray
注意:
array函数支持Python创建的列表和元素。
array()内的值一定是元素或列表,而不能是其他值。
array()转换后的对象类型会根据默认为实际可用值,也可手动指定。
当然,很多场景下被转换的变量可能不是上述“现成” 的矩阵,这时候需要我们“手动”进行转换。如下列代码,原始被转换的变量是一个1行15列的数组,这时候我们需要根据实际需求将其转换为3行5列的数组,通过reshape函数即可实现。
>>> import NumPy as np
>>> a3 = np.arange(15).reshape(3, 5)
>>> print a3
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]
第二种,某些时候数组里面的值可能是未知的,但矩阵的大小其实是已经确定的,比如我们了解到接下来的运算中需要一个3行4列的矩阵,那么就可以利用NumPy创建矩阵。当然,矩阵的值可能为空,也可以是某些特定值,这取决于创建的方法。
方法一:使用zeros创建全为0的矩阵。如下代码创建了一个3行4列且值全为0的二维矩阵。
>>> a4 = np.zeros((3,4))
>>> print a4
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]
方法二:使用ones创建全为1的矩阵。如下代码创建了一个三维,每个维都是3行4列的矩阵。
>>> a5 = np.ones((3,4))
>>> print a5
[[[ 1, 1, 1, 1],
[ 1, 1, 1, 1],
[ 1, 1, 1, 1]],
[[ 1, 1, 1, 1],
[ 1, 1, 1, 1],
[ 1, 1, 1, 1]]]
方法三:使用arange或者linspace创建一个新的数值序列数组。
#使用arange创建从10到30,步长为5的数值序列,其中开始数值10以及步长5都是可选设置
>>> a7 = np.arange( 10, 30, 5 )
>>> print a7
[10, 15, 20, 25]
#使用linspace创建从0到2,一共9个数值的序列
>>> a8 = np.linspace( 0, 2, 9 )
>>> print a8
[ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ]
arange函数和linspace都可以创建固定起止数值的数组,但二者的区别在于arange通过控制步长确定数组个数,而linspace直接设置个数(而自动设置步长)。
简单的NumPy数组运算
数组间简单运算
>>> arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
>>> arr2 = np.array([[2., 3., 4.], [5., 6., 7.]])
#数组加法
>>> print arr1 + arr2
[[3, 5, 7],
[9, 11, 13]]
#数组减法
>>> print arr1 – arr2
[[-1, -1, -1],
[-1, -1, -1]]
#数组乘法
>>> print arr1 * arr2
[[2, 6, 12],
[20, 30, 42]]
#数组除法
>>> print arr1 / arr2
[[0.5, 0.6667, 0.75],
[0.8, 0.8333, 0.8571]]
数组与数值运算
数组与数值运算的基本方法与数组间运算语法相同,在此只举一个例子,其余参加数组间语法。
>>> arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
#数组与数值加法
>>> print (arr1 + 2)
[[3 , 4, 5],
[6 , 7, 8]]
#数组与数值减法
>>> print (arr1 – 2)
[[-1, 0, 1],
[2, 3, 4]]
#数组与数值乘法
>>> print (arr1 * 2)
[[2, 4, 6],
[8, 10, 12]]
#数组与数值除法
>>> print (arr1 / 2)
[[0.5, 1, 1.5],
[2, 2.5, 3]
数组函数运算
通用函数( 又称ufunc)是一个在ndarrays的数据上进行基于元素的操作的函数。NumPy提供常见的数学函数如sin、cos和exp,也提供简单的统计函数如mean, std, vary等。实际上,之前我们已经在使用一些通用函数了,例如生成有序序列的arange、生成全为1的zeros函数等。 这部分重点介绍的是NumnPy的常用来做计算的函数。
>>> arr = np.arange(4)
>>> print arr
[0, 1, 2, 3]
#求arr的绝对值
>>> print np.abs(arr)
[0, 1, 2, 3]
#求arr的平方根
>>> print np.sqrt(arr)
[0, 1, 1.414, 1.732]
#求arr的平方
>>> print np.square(arr)
[0, 1, 4, 9]
#求arr的指数
>>> print np.exp(arr)
[1, 2.728, 7.389, 20.086]
#求arr以e为底的对数
>>> print np.log(arr)
[-inf, 0, 0.693, 1.099]
#求arr每个元素的正负号
>>> print np.sign(arr)
[0, 1, 1, 1]
#求arr每个元素的cos值
>>> print np.cos(arr)
[1, 0.540, -0.416, -0.990]
数组统计运算
数据统计是Python做数据分析的重要步骤,NumPy提供了常用的求和、均值、方差、标准差、最大最小值、累积等函数。以下以sum求和函数为例解释使用方法,其余函数用法类似。
>>> arr = np.arange(6).reshape(2,3)
>>> print arr
[[0, 1, 2],
[3, 4, 5]]
#求arr的全部(行和列)的总和
>>> print np.sum(arr)
15
#大多数情况下,我们会指定求某列或某行的和
#求基于列的和
>>> print np.sum(arr, axis = 1)
[3, 12]
#求基于行的和
>>> print np.sum(arr, axis = 0)
[3, 5, 7]
NumPy数组预处理
数据预处理是在进行数据挖掘、探索、学习之前的必要步骤,NumPy提供了较多的数据预处理功能。例如转置、索引、切片、数组间函数处理、逻辑条件表达式、排序、集合等。
NumPy数组转置
数组转置是将数据进行矩阵“对换”的一种方式,NunPy提供了transpose函数和.T属性两种是实现形式。
#一维数组转置
>>> arr = np.arange(6)
>>> print arr
[0, 1, 2, 3, 4, 5]
>>> print np.transpose(arr)
[0, 1, 2, 3, 4, 5]#一维还是一维…
#二维数组转置
>>> arr = np.arange(6).reshape((2,3))
>>> print arr
[[0, 1, 2],
[3, 4, 5]]
>>> print np.transpose(arr)
[[0,3],
[1,4],
[3,5]]
网友评论