Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pandas也是基于numpy构建的,机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。
目录
1.如何构建numpy数组
构建numpy数组的方法很多,比较常用的方法是用np.array函数对列表进行转化。
# 通过列表创建一维数组import numpy as nplist1 = [0,1,2,3,4]arr1d = np.array(list1)#打印数组和类型print(type(arr1d))arr1d[0 1 2 3 4]
数组和列表最关键的区别是:数组是基于向量化操作的,列表不是,我们在实际项目中处理的数据一般是矩阵结构,对该数据以行向量或列向量的形式进行计算,向量计算是基于数组实现的,因此数组比列表的应用更广。
函数可以应用到数组的每一项,列表不行。
比如,不可以对列表的每一项数据都加2,这是错误的。
list1 + 2 # 错误
可以对数组的某一项数据都加2
# Add 2 to each element of arr1darr1d + 2#> array([2, 3, 4, 5, 6])
另一个区别是已经定义的numpy数组不可以增加数组大小,只能通过定义另一个数组来实现,但是列表可以增加大小。
然而,Numpy有更多的优势,让我们一起来发现。
numpy可以通过列表中的列表来构建二维数组。
# Create a 2d array from a list of listslist2 = [[0,1,2], [3,4,5], [6,7,8]]arr2d = np.array(list2)arr2d#> array([[0, 1, 2],#> [3, 4, 5],#> [6, 7, 8]])
你也可以通过dtype参数指定数组的类型,一些最常用的numpy类型是:'float','int','bool','str'和'object'。
# Create a float 2d arrayarr2d_f = np.array(list2, dtype='float')arr2d_f#> array([[ 0., 1., 2.],#> [ 3., 4., 5.],#> [ 6., 7., 8.]])
输出结果的小数点表示float类型,你也可以通过 astype方法转换成不同的类型。
# 转换成‘int’类型arr2d_f.astype('int')#> array([[0, 1, 2],#> [3, 4, 5],#> [6, 7, 8]])# 先转换‘int’类型,再转换‘str’类型arr2d_f.astype('int').astype('str')#> array([['0', '1', '2'],#> ['3', '4', '5'],#> ['6', '7', '8']],#> dtype='U21')
另一个区别是数组要求所有项是同一个类型,list没有这个限制。如果你想要一个数组包含不同类型,设置‘dtype’为'object'。
# 构建布尔类型数组arr2d_b = np.array([1, 0, 10], dtype='bool')arr2d_b#> array([ True, False, True], dtype=bool)# 构建包含数值和字符串的数组arr1d_obj = np.array([1, 'a'], dtype='object')arr1d_obj#> array([1, 'a'], dtype=object)
最终使用 tolist()函数使数组转化为列表。
# Convert an array back to a listarr1d_obj.tolist()#> [1, 'a']
总结数组和列表主要的区别:
2.如何观察数组属性的大小和形状(shape)
一维数组由列表构建,二维数组arr2d由列表的列表构建,二维数组有行和列,比如矩阵,三维数组由嵌入了两个列表的列表构建。
假设给定一个数组,我们怎么去了解该数组的属性。
数组的属性包括:
数组元素的表示(通过索引)
# 定义3行4列的二维数组list2 = [[1, 2, 3, 4],[3, 4, 5, 6], [5, 6, 7, 8]]arr2 = np.array(list2, dtype='float')arr2#> array([[ 1., 2., 3., 4.],#> [ 3., 4., 5., 6.],#> [ 5., 6., 7., 8.]])# 形状(shape)print('Shape: ', arr2.shape)# 数组类型(dtype)print('Datatype: ', arr2.dtype)# 数组大小(size)print('Size: ', arr2.size)# 数组维度(ndim)print('Num Dimensions: ', arr2.ndim)# 取数组第3行3列元素print('items of 3 line 3 column: ', c[2,2])#> Shape: (3, 4)#> Datatype: float64#> Size: 12#> Num Dimensions: 2#> items of 3 line 3 column: 7
3. 如何从数组提取特定的项
数组的索引是从0开始计数的,与list类似。numpy数组通过方括号的参数以选择特定的元素。
# 选择矩阵的前两行两列arr2[:2, :2]list2[:2, :2] # 错误#> array([[ 1., 2.],#> [ 3., 4.]])
numpy数组支持布尔类型的索引,布尔型索引数组与过滤前(array-to-be-filtered)的数组大小相等,布尔型数组只包含Ture和False变量,Ture变量对应的数组索引位置保留了过滤前的值 。
arr2#> array([[ 1., 2., 3., 4.],#> [ 3., 4., 5., 6.],#> [ 5., 6., 7., 8.]])# 对数组每一个元素是否满足某一条件,然后获得布尔类型的输出b = arr2 > 4b#> array([[False, False, False, False],#> [False, False, True, True],#> [ True, True, True, True]], dtype=bool)# 取布尔型数组保留的原始数组的值arr2[b]#> array([ 5., 6., 5., 6., 7., 8.])
3.1 如何反转数组
# 反转数组的行arr2[::-1, ]#> array([[ 5., 6., 7., 8.],#> [ 3., 4., 5., 6.],#> [ 1., 2., 3., 4.]])# Reverse the row and column positions# 反转数组的行和列arr2[::-1, ::-1]#> array([[ 8., 7., 6., 5.],#> [ 6., 5., 4., 3.],#> [ 4., 3., 2., 1.]])
3.2 如何处理数组的缺失值(missing)和无穷大(infinite)值
缺失值可以用np.nan对象表示,np.inf表示无穷大值,下面用二维数组举例:
# 插入nan变量和inf变量arr2[1,1] = np.nan # not a numberarr2[1,2] = np.inf # infinitearr2#> array([[ 1., 2., 3., 4.],#> [ 3., nan, inf, 6.],#> [ 5., 6., 7., 8.]])# 用-1代替nan值和inf值missing_bool = np.isnan(arr2) | np.isinf(arr2)arr2[missing_bool] = -1 arr2#> array([[ 1., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])
3.3 如何计算n维数组的平均值,最小值和最大值
# 平均值,最大值,最小值print("Mean value is: