1. 简介
数据分析的流程概括起来主要是:读写、处理计算、分析建模和可视化4个部分。
Numpy 是Python 进行科学计算,数据分析时,所用到的一个基础库。它是大量Python数据和科学计算包的基础,如Pandas库就用到了Numpy。
Numpy(Numerical Python)是Python的一个扩展程序库,支持大量的维度数组与矩阵运算,此外,针对数组运算也可以提供大量的数据函数库。
Numpy 是一个运行速度非常快的数学库,主要用于数组计算,包括以下方面:
- 一个强大的N维数组对象ndarray。
- 广播功能函数。
- 整合C/C++/Fortran代码的工具。
- 线性代数、傅立叶变换、随机数生成功能。
Numpy 通常与 Scipy(Scientific Python)和 Matplotlib(绘图库)一起使用,这种组合广泛用于替代MatLab,是一个强大的科学计算环境,有助于通过Python学习数据科学或者机器学习。
2. 安装和导入Numpy
安装、导入和使用Numpy:
# 安装Numpy '''Windows 按住win+R 输入 cmd,Mac 打开Terminal pip install numpy ''' import numpy as np # 导入numpy并取别名 print(np.__version__) # 如果显示版本信息,说明安装和导入成功;1.22.1 print(np.eye(3)) # 使用eye(n) 生成对角矩阵 # 输出 ''' [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] '''
3. ndarray 对象
ndarray 是 Numpy 库的基础,是一种由同质元素构成的多维数组。元素数量是事先指定好的,同质指的是所有元素的类型和大小都相同。数据类型由dtype(data-type,数据类型)的Numpy对象指定。每个ndarray只有一种dtype类型。
数组的维数和元素的数量由数组的形状(shape)确定,数组的形状由N个正整数组成的元组指定,元组的每个元素对应每一维的大小。数组的维统称为轴(axes),轴的数量被称作秩(rank)。
Numpy 数组的另一个特点是大小固定,在创建数组时指定大小,然后就不再发生改变。这与Python的列表有所不同,列表的大小时可以改变的。
1) 创建ndarray对象
使用array()
,通过嵌套列表或元组定义为多维数组。
numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
参数说明如下:
- object:数组或嵌套的数列。
- dtype:数组元素的数据类型,可选。
- copy:对象是否需要复制,可选。
- order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)。
- subok:默认返回一个与基类类型一致的数组。
- ndmin:指定生产数组的最小维度。
import numpy as np # 导入numpy并取别名 a = np.array([1,2,3]) # 定义一维 ndarray 对象 b = np.array([[1,2],[3,4]]) # 定义多维 ndarray 对象 print(a) # 输出 [1 2 3] print(b) ''' 输出 [[1 2] [3 4]] ''' print(b.itemsize) # 使用itemsize属性可以获取每个元素的大小(以字节为 print(b.data) # 使用data属性表示包含数组实际元素的缓冲区
使用empty()
函数可以创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组。
numpy.empty(shape,dtype=float,order='C')
参数说明如下:
- shape:数组形状。
- dtype:数据类型,可选。
- order:有‘C’和’F’两个选项,分别代表行优先和列优先,在计算机内存中存储元素的顺序。
import numpy as np # 导入numpy并取别名 x = np.empty([2,2],dtype=int) print(x) '''输出 [[1 2] [3 4]] '''
使用zeros()
,可以创建指定大小的数组,数组元素初始为0,语法格式和empty()
相同。
import numpy as np # 导入numpy并取别名 x = np.zeros([2,2],dtype=int) print(x) '''输出 [[0 0] [0 0]] '''
使用ones()
,可以创建指定大小的数组,数组元素初始为1,语法格式和empty()
相同。
import numpy as np # 导入numpy并取别名 x = np.ones([2,2],dtype=int) print(x) '''输出 [[1 1] [1 1]] '''
2) 数据类型
Numpy 支持的数据类型比Python内置的类型要多,基本上与C语言的数据类型对应,具体如下:
- bool:布尔型数据类型(True或False)
- int:默认的整数类型(类似于C语言中的long、int32或int64)
- intc:与C的int类型一样,一般是int32或int64
- intp:用于索引的整数类型(类似于C的ssize_t,一般情况下仍然是int32或int64)
- int8:字节(-128~127)
- int16:整数(-32768~32767)
- int32:整数(-2147483648~2147483647)
- int64:整数
- uint8:无符号整数(0~255)
- uint16:无符号整数(0~65535)
- uint32:无符号整数(0~4294967295)
- uint64:无符号整数
- float:float64类型的简写
- float16:半精度浮点数,包括1个符号位,5个指数位,10个尾数位
- float32:单精度浮点数,包括1个符号位,8个指数位,23个尾数位
- float64:双精度浮点数,包括1个符号位,11个指数位,52个尾数位
- complex:complex128类型的简写,即128位复数
- complex64:复数,表示双32位浮点数(实数部分和虚数部分)
- complex128:复数,表示双64位浮点数(实数部分和虚数部分)
3) 数组属性
Numpy中,每一个线性的数组称为一个轴(axis),也就是维度(dimension)。二维数组相当于两个一维数组,其中一个数组中每个元素又是一个一维数组。包含的主要属性如下:
- ndarray.ndim:秩,即轴的数量或维度的数量。
- ndarray.shape:数组的形状,对于矩阵,表示n行m列。
- ndarray.size:数组元素的总个数,相当于n*m的值。
- ndarray.dtype:ndarray对象的元素类型。
- ndarray.itemsize:ndarray对象中每个元素的大小,以字节为单位。
- ndarray.flags:ndarray对象中每个元素的内存信息。
- ndarray.real:ndarray元素的实部。
- ndarray.imag:ndarray元素的虚部。
- ndarray.data:包含实际数组元素的缓冲区。一般通过数组的索引获取元素,所以通常不需要使用这个属性。
import numpy as np # 导入numpy并取别名 b = np.array([[1,2],[3,4]]) print(b) '''输出 [[1 2] [3 4]] ''' print(type(b)) # <class 'numpy.ndarray'> print(b.dtype) # int64 print(b.ndim) # 2 print(b.size) # 4 print(b.shape) # (2, 2)
4. 基本运算
1) 算术运算
import numpy as np a = np.array([1,2,3,4]) print(a+2) # [3 4 5 6] print(a-2) # [-1 0 1 2] print(a*2) # [2 4 6 8] print(a/2) # [0.5 1. 1.5 2. ] b = np.array([2,3,4,5]) print(b-a) # [1 1 1 1]
2) 矩阵积
dot()
函数能够返回两个数组的点积。一维数组,位置相同的元素相乘,然后再求和,二维数组(矩阵)之间的运算,则得到的是矩阵积。
a.dot(b)与np.dot(a,b) 效果相同,矩阵积计算不遵循交换律,也就是np.dot(a,b)和np.dot(b,a)得到的结果不一样。
import numpy as np a = np.array([1,2,3,4]) b = np.array([4,5,6,7]) print(np.dot(a,b)) # 60 c = np.array([[1,2],[3,4]]) d = np.array([[5,6],[7,8]]) print(np.dot(c,d)) '''输出 [[19 22] [43 50]] ''' print(np.dot(d,c)) '''输出 [[23 34] [31 46]] '''
3) 自增和自减
使用+=和-=运算符可以实现数组自增和自减。
import numpy as np a = np.array([[1,2],[3,4]]) a += 1 print(a) '''输出 [[2 3] [4 5]] '''
4) 通用函数
三角函数等很多数学运算符符合通用函数的定义,计算平方根的sqrt()
函数、用来取对数的log()
函数和正弦函数sin()
。
import numpy as np a = np.array([[1,2],[3,4]]) print(np.sin(a)) '''输出 [[ 0.84147098 0.90929743] [ 0.14112001 -0.7568025 ]] '''
5) 聚合函数
聚合函数是指对一组值,进行操作,返回一个单一值作为结果的函数。
import numpy as np a = np.array([[1,2],[3,4]]) print(a.sum()) # 10 print(a.min()) # 1 print(a.max()) # 4 print(a.std()) # 1.118033988749895
5. 索引、切片和迭代
1) 索引
访问单个元素,用法与list类似。
import numpy as np a = np.array([1,2,3,4]) print(a[2]) # 3 b = np.array([[1,2],[3,4]]) print(b[1,1]) # 4 print(b[-1,-1]) # 4
2) 切片
切片抽取数组的一部分元素并生成新数组。
import numpy as np a = np.array([range(0,10),range(10,20),range(20,30),range(40,50)]) print(a[1:5,1:7]) # 截取连续局部矩阵 '''输出 [[11 12 13 14 15 16] [21 22 23 24 25 26] [41 42 43 44 45 46]] ''' print(a[[1,3],1:7]) '''输出 [[11 12 13 14 15 16] [41 42 43 44 45 46]] '''
3) 迭代
对于一维数组,可以使用for进行迭代;对于二维数组,可以使用嵌套的for进行迭代,外层for扫描行,内层for扫描列。
import numpy as np a = np.array([[1,2],[3,4]]) for row in a: for col in row: print(col,end=' ') print(' ') # 换行 for item in a.flat: # flat 表示数组元素迭代器 print(item,end=' ')
6. 条件和布尔数组
使用条件表达式和布尔运算符有选择地抽取元素。
import numpy as np a = np.random.random((4,4)) print(a) '''输出 [[0.49954069 0.42753987 0.25914236 0.1253001 ] [0.48690952 0.35854975 0.07134125 0.2598206 ] [0.15511689 0.8465675 0.9928091 0.40122818] [0.21870776 0.97000971 0.92714403 0.97068106]] ''' print(a[a<0.5]) '''输出 [0.49954069 0.42753987 0.25914236 0.1253001 0.48690952 0.35854975 0.07134125 0.2598206 0.15511689 0.40122818 0.21870776] '''
7. 变换形状
使用reshape()函数可以改变数组的形状,该函数返回一个新数组。
import numpy as np a = np.random.random(12) print(a) print(a.reshape(3,4)) a.shape = (2,6) # 直接将新形状的元组赋值给shape属性 print(a)
改变数组形状的操作是可逆的,使用ravel()
函数可以把二维数组再变回一维数组。甚至直接改变数组shape属性的值。使用transpose()
函数可以实现行、列位置的矩阵转置。
import numpy as np a = np.array([[1,2],[3,4]]) b = a.transpose() # 行列位置转置 b ''' 输出 array([[1, 3], [2, 4]]) '''
8. 操作数组
1) 合并数组
合并数组有以下3种方法:
- np.concatenate:合并维数相同的两个数组。
- np.vstack:垂直方向合并一维数组和二维数组。
- np.hstack:水平方向合并一维数组和二维数组。
a = np.ones((2,2)) b = np.zeros((2,2)) print(np.vstack((a,b))) # 垂直方向 ''' 输出 [[1. 1.] [1. 1.] [0. 0.] [0. 0.]] ''' print(np.hstack((a,b))) # 水平方向 ''' 输出 [[1. 1. 0. 0.] [1. 1. 0. 0.]] '''
column_stack()
和row_stack()
两个函数把一维数组作为列或行入栈结构,以形成一个新的二维数组。
import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) d = np.column_stack((a,b)) print(d) ''' 输出 [[1 4] [2 5] [3 6]] ''' e = np.row_stack((a,b)) print(e) ''' 输出 [[1 2 3] [4 5 6]] '''
2) 切分数组
切分数组有以下3种方法:
- np.split:分割。
- np.vsplit:垂直分割。
- np.hsplit:水平分割。
import numpy as np a = np.arange(16).reshape(4,4) print('原数组:') print(a) print('默认分割(0轴):') b = np.split(a,2) print(b) print('垂直方向分割:') c = np.vsplit(a,2) print(c) print('水平方向分割:') d = np.hsplit(a,2) print(d)