Python数据分析--Numpy常用函数介绍(1)--工具安装及Numpy介绍
Anaconda 是一个跨平台的版本,通过命令行来管理安装包。进行大规模数据处理、预测分析和科学计算。它包括近 200 个工具包,大数据处理需要用到的常见包有 NumPy 、 SciPy 、 pandas 、 IPython 、 Matplotlib 、 Scikit-learn 、gensim、nltk、networkx、beautifulsoup4和statsmodels 等。
可以直接通过命令进行安装。如下图,分别安装上述相关文件( 示例安装pandas,其他类似 )。
一、NumPy(Numerical Python)
NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,也针对数组运算提供大量的数学函数库。NumPy 为开放源代码并且由许多协作者共同维护开发,是一个运行速度非常快的数学库,用于数组计算。
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,可广泛用于替代 MatLab,是一个强大的科学计算环境,便于后期学习数据科学和者机器学习。 SciPy 是一个开源的 Python 算法库和数学工具包, 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面,是为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API),前期在数据可视化中做作过简单的介绍。
1、numpy中的数组操作及代码
NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:实际的数据和描述这些数据的元数据,大部分的数组操作仅仅修改元数据部分。
import numpy as np # 导入numpy包,并另命令为np a = np.arange(5) # 调用numpy中的函数arange,函数创建数组 print (a.dtype) # 打印出数组a的数据类型 print (a.shape) # 数组的 shape 属性返回一个元组(tuple),元组中的元素即为NumPy数组每一个维度上的大小 print ( ' \n ' ) # 创建多维数组 m = np.array([np.arange(5), np.arange(5)]) # 列表作为参数传给array函数,从而创建了一个5×2的数组 print (m) # 选取数组元素 print (m[0,0]) print (m[0,1 ]) print (m[1,1 ]) print (m[1,2 ]) print (m[1,3 ]) # NumPy 自定义的异构数据类型,该数据类型包括一个用字符串记录的名字、一个用 # 整数记录的数字以及一个用浮点数记录的价格 t = np.dtype([( ' name ' , np.str_, 40), ( ' numitems ' , np.int32), ( ' price ' ,np.float32)]) print (t) # 一维数组的索引和切片 a = np.arange(9 ) print (a[3:7 ]) print ( ' \n ' ) # 多维数组的切片和索引 b = np.arange(24).reshape(2,3,4) # reshape函数的作用是改变数组的“形状”,也就是改变数组的维度 # 其参数为一个正整数元组,分别指定数组在每个维度上的大小 print (b.shape) print ( ' \n ' ) print (b) print ( ' \n ' ) print (b[0]) print ( ' \n ' ) print (b[:,0,0]) # 下标用英文标点的冒号:来代替,表示不限该位置的参数,即打印出b的第1行,第1列的所有元组的数据。
运行结果如下:
至于具体更详细的用法,可以多试试。
二、numpy改变数组的维度
上述的reshape函数可以将一维数组[0,1,2,...,23]转变为具有2个元素,每个元素是一个二维数组的三维数组,同样,也可以将多维数组转变为一维数组(将数组展平)。
可以用 ravel 等函数完成相关操作,见如下代码:
import numpy as np # 导入numpy包,并另命令为np c = np.array([ #先定义一个numpy的多维数组
[[0, 1,2,3],[4,5,6,7],[8,9,10,11 ]],
[[ 12,13, 14,15],[16,17,18,19],[20,21,22,23 ]]
])
e =d= c print (c.ravel()) print ( ' \n ' ) print (c.flatten()) print ( ' \n ' ) # 用元组设置维度 d.shape = (6,4 ) print (d) print ( ' \n ' ) # transpose用于转置,即行列互换,即线性代数中的转置矩阵 print (e.transpose())
运行结果:
三、数组的组合
NumPy数组有水平组合、垂直组合和深度组合等多种组合方式,使用 vstack 、dstack 、 hstack 、 column_stack 、 row_stack 以及 concatenate 等函数来完成数组的组合。
import numpy as np # 导入numpy包,并另命令为np a = np.arange(9).reshape(3,3 ) #定义a为3行3列的二维数组
b =2* a #定义b,且b的每个元素均为a的两倍。 print (a) #打印出a数列 print ( ' \n ' ) print (b) #打印出b数列
print ( ' \n ' )
运行结果:
[[0 1 2] [3 4 5] [6 7 8]] [[ 0 2 4] [ 6 8 10] [12 14 16]]
分别看一下组合后的运行结果,代码如下:
import numpy as np # 导入numpy包,并另命令为np a = np.arange(9).reshape(3,3) # 定义a为3行3列的二维数组 b=2*a # 定义b,且b的每个元素均为a的两倍,数组结构与a一致。 # 水平组合:将ndarray对象构成的元组作为参数,传给hstack 函数 print (np.hstack((a, b))) # 水平组合 print ( ' \n ' ) print (np.concatenate((a, b), axis=1)) # 注意axis参数 print ( ' \n ' ) # 垂直组合 print (np.vstack((a, b))) print ( ' \n ' ) print (np.concatenate((a, b), axis=0)) # 注意axis=0是默认值,即可以不设置。 print ( ' \n ' )
运行结果如下:
很明显,上述函数np.hstack((a,b))的结果显示为将a的行与b的行连成一个更长的行(np.concatenate()函数一样,只是多了一个参数),相当于增加了数组的列数。
而np.vstack((a,b)),则是结合成具有更多的行,而列数不变。用二维表示如下:
接下来看一下深度组合、列组合、行组合
import numpy as np # 导入numpy包,并另命令为np a = np.arange(9).reshape(3,3) # 定义a为3行3列的二维数组 b=2*a # 定义b,且b的每个元素均为a的两倍,数组结构与a一致。 # 深度组合 将相同的元组作为参数传给 dstack print (np.dstack((a, b))) print ( ' \n ' ) # 列组合 print (np.column_stack((a, b))) # 对于二维数组,column_stack 与hstack的效果是相同 print ( ' \n ' ) # 行组合 print (np.row_stack((a,b))) # 对于二维数组,column_stack与vstack 的效果是相同
从上可以看出,深度组合,就是将一系列数组沿着纵轴(深度)方向进行层叠组合,比如这里只有2个数组a和b,所以深度只有2,由于a和b都是3*3,就形成如下结果:
二维数组中,行组合和列组合与水平组合、垂直组合一样,不作过多介绍。
四、数组的分割
数组能组合 ,当然也能分割成多个子数组。像组合一样,也可分为水平分割、垂直分割、深度分割。
1、水平分割 和垂直分割
import numpy as np # 导入numpy包,并另命令为np a = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) # 定义一个多维数组 # 水平分割 print (np.hsplit(a,3)) # hsplit把数组沿着水平方向分割为3个相同大小的子数组 # 或者 print (np.split(a,3,axis=1)) # 同hsplit # 垂直分割 print (np.vsplit(a,3)) # vsplit把数组沿着垂直方向分割为3个相同大小的子数组 # 或者 print (np.split(a,3,axis=0)) # 同vsplit,注意参数
运行结果:
整理后,得到:[array([[0],[3],[6]]), array([[1], [4],[7]]), array([[2],[5],[8]])]也就是将0,3,6归为一组, 注意:都是分别用"[ ]"和","分开的。
2、深度分割
import numpy as np # 导入numpy包,并另命令为np c = np.array(np.arange(27).reshape(3, 3, 3)) # 创建一个多维数组,并设置 print (np.dsplit(c,3))
运行结果如下:
[array([[[ 0],[ 3],[ 6]],[[ 9],[12],[15]],[[18], [21], [24]]]),
array([[[ 1],[ 4],[ 7]],[[10],[13],[16]], [[19], [22], [25]]]),
array([[[ 2],[ 5],[ 8]],[[11],[14],[17]],[[20],[23], [26]]])
]
生成的C数组为 :
这三块数据应该像纸张一样叠加的,0,3,6的下一层对应的是9,12,15,再下一层是18,21,24。
五、Numpy数组的其他属性
在开始的代码中有 .dtype和 .shape分别是数组的两个不同的属性,除此之外,还有其他属性,如下:
import numpy as np # 导入numpy包,并另命令为np a = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) # 定义一个多维数组 print (a.dtype) # 数组a的数据类型 print (a.shape) # 数组a的维数 print (a.ndim) # 给出数组的维数,或数组轴的个数 print (a.size) # 给出数组元素的总个数 print (a.itemsize) # 元素在内存中所占的字节数 print (a.nbytes) # 元素在内存中所占的存储空间,itemsize和size属性值的乘积 # 复数的表示 b = np.array([1.j + 1, 2.j + 3 ]) print (b.real) # 打印实数 print (b.imag) # 打印虚数部分 c = np.arange(4).reshape(2,2 ) print (c)
f = c.flat # flat属性,可以像遍历一维数组一样去遍历任意的多维数组 for item in f : print (item) # 或者获取多个元素 print ( c.flat[[1,3 ]]) # flat 属性是一个可赋值的属性。对flat属性赋值将导致整个数组的元素都被覆盖 c.flat=5 # 对flat属性赋值将导致整个数组的元素都被覆盖 print (c)
b = np.array([1.j + 1, 2.j + 3]) # 数组的转换 print ( b.tolist()) print ( b.astype(int)) # astype 函数可以在转换数组时指定数据类型int
运行结果如下:
小结:
上述列举了许多有关NumPy的基础知识:数据类型和NumPy数组。类似于Python列表,NumPy数组也可以方便地进行切片和索引操作。但在多维数组上,NumPy有明显的优势。
对涉及改变数组维度的操作有很多种——组合、调整、设置维度和分割等,列举了实用函数进行了说明。