科学计算库——numpy
一、概述
numpy作为高性能科学计算和数据分析的基础包,它是众多数据分析、机器学习等工具的基础架构,掌握numpy的功能及其用法将有助于后续其他数据分析工具的学习。本章将针对numpy库的基础功能进行详细地讲解。
二、数组对象
2.1 什么是数组对象
numpy中提供了一个重要的数据结构是ndarray(又称为array)对象,该对象是一个N维数组对象,可以存储相同类型、以多种形式组织的数据。
与Python中的数组相比,ndarray对象可以处理结构更复杂的数据。
数组指由相同类型的数据按有序的形式组织而成的一个集合,组成数组的各个数据称为数组的元素。
2.2 ndarray对象的常用属性
属性 | 说明 |
---|---|
ndim | 数组的维度 |
shape | 数组中各维度的大小 |
size | 数组元素的总数目 |
dtype | 数组元素的类型 |
itemsize | 数组中各元素的字节大小 |
- ndim属性表示数组的维度。在numpy中,维度称为轴,轴的个数称为秩。
- 一维数组只有一个轴,其内部的所有数据沿轴方向依次排列;二维数组的结构类似于表格,它一共有沿行方向和列方向的两个轴,其中沿行方向的轴对应编号为0的轴,沿列方向的轴对应编号为1的轴;三维数组的结构类似立方体,它一共有沿着长、宽、高方向的三个轴,这三个轴依次对应着编号为1、2、0的轴。
- shape属性表示数组的形状,也就是数组中各维度的大小,该属性的值为一个形如(行,列)的元组。
2.3 numpy的常用数据类型
数据类型 | 说明 |
---|---|
bool | 布尔类型,值为True或False |
int8、uint8 | 有符号和无符号的8位整数 |
int16、uint16 | 有符号和无符号的16位整数 |
int32、uint32 | 有符号和无符号的32位整数 |
int64、uint64 | 有符号和无符号的64位整数 |
float16 | 半精度浮点数(16位) |
float32 | 半精度浮点数(32位) |
float64 | 半精度浮点数(64位) |
complex64 | 复数,分别用两个32位浮点数表示实部和虚部 |
complex128 | 复数,分别用两个64位浮点数表示实部和虚部 |
三、创建数组
3.1 根据现有数据类型创建数组
numpy中使用array()函数创建一个数组,该函数需要接收一个列表或元组。
- 创建一维数组
- 创建二维数组
- 创建三维数组
3.2 根据指定数值创建数组
numpy中使用zeros()、ones()、empty()函数创建一个基于指定数值的数组,其中zeros()函数用于创建一个元素值都为0的数组;ones()函数用于创建一个元素值都为1的数组;empty()函数用于创建一个元素值都为随机数的数组。
语法格式:
zeros(shape, dtype=float, order='C')
ones(shape, dtype=None, order='C')
empty(shape,dtype=float,order='C' )
shape:表示数组的形状。
dtype:(可选)表示数组中元素的类型,默认为float(浮点数)。
order:表示按索引顺序读取数组的元素,默认为’C’,说明采用C语言风格,按行排列数组的元素
- 使用zero()函数创建数组
- 使用ones()函数创建数组
- 使用empty()函数创建数组
3.3 根据指定数值范围创建数组
numpy中使用arange()函数创建一个基于指定区间均匀分布数值的数组
,arange()函数的功能类似于Python中的range()函数,不同的是,arange()函数会返回一维数组而非列表。
# 创建一个元素位于[1,30)区间、元素值间隔为5的数组
array_demo = np.arange(1, 30, 5)
print(array_demo)
四、访问数组元素
数组支持通过索引和切片访问元素。numpy中提供了多种形式的索引:整数索引、花式索引和布尔索引,通过这些索引可以访问数组的单个、多个或一行元素。此外,还可以使用切片访问数组的元素。
- 整数索引
- 花式索引
- 布尔索引
4.1 使用整数索引访问元素
numpy中可以使用整数索引访问数组,以获取该数组中的单个元素或一行元素
。
一维数组访问元素的方式与列表访问元素方式相似
,它会根据指定的整数索引获取相应位置的元素。
import numpy as np
array_1d = np.arange(1, 7)
print(array_1d)
# 获取索引为2的元素
print(array_1d[2])
当使用整数索引访问二维数组时,二维数组会根据索引获取相应位置的一行元素,并将该行元素以一维数组的形式进行返回
。
array_2d = np.arange(1, 7).reshape(2, 3)
print(array_2d)
# 获取索引为1的一行元素
print(array_2d[1])
若想获取二维数组的单个元素
,需要通过“二维数组[行索引,列索引]”形式
实现。
# 获取行索引为1、列索引为2的元素
print(array_2d[1, 2])
4.2 使用花式索引访问元素
- 什么是花式索引?
花式索引指以整数组成的数组或列表为索引
。当使用花式索引访问一维数组时,会将花式索引对应的数组或列表的元素作为索引,依次根据各个索引获取对应位置的元素,并将这些元素以数组的形式进行返回;当使用花式索引访问二维数组时,会将花式索引对应的数组或列表的元素作为索引,依次根据各个索引获取对应位置的一行元素,并将这些行元素以数组的形式进行返回。
- 使用花式索引访问一维数组
import numpy as np
array_1d = np.arange(1, 10)
print(array_1d)
# 访问索引为[2,5,8]的元素
print(array_1d[[2, 5, 8]])
- 使用花式索引访问二维数组
在使用两个花式索引,即通过“二维数组[花式索引,花式索引]”形式访问数组时,会将第一个花式索引对应列表的各元素作为行索引,将第二个花式索引对应列表的各元素作为列索引,再按照“二维数组[行索引,列索引]”的形式获取对应位置的元素。
array_2d = np.arange(1, 10).reshape((3, 3))
print(array_2d)
# 访问索引为[0, 2]的元素
print(array_2d[[0, 2]])
# 使用两个花式索引访问元素
print(array_2d[[0, 2], [1, 1]])
4.3 使用布尔索引访问元素
- 什么是布尔索引?
布尔索引指以布尔值组成的数组或列表为索引
。当使用布尔索引访问数组时,会将布尔索引对应的数组或列表的元素作为索引,以获取索引为True时对应位置的元素。
array_2d = np.arange(1, 10).reshape((3, 3))
print(array_2d)
# 使用布尔索引访问数组
print(array_2d > 5)
print(array_2d[array_2d > 5])
4.4 使用切片访问元素
- 一维数组的切片操作
array_1d = np.array([10, 20, 30, 40, 50, 60])
print(array_1d[1:3])
print(array_1d[:3])
print(array_1d[:-1])
print(array_1d[:])
print(array_1d[::2])
- 二维数组的切片操作
与一维数组相比,二维数组支持更多的切片操作,不仅可以向中括号内传入一个切片
,还可以传入两个切片
,甚至可以混合传入索引和切片
。
# 创建二维数组
arr_2d = np.array([[1, 2, 3],
[4, 5, 6], [7, 8, 9]])
print(arr_2d)
# 传入一个切片
# 使用切片访问前两行的元素
print(arr_2d[:2])
# 传入两个切片
# 使用切片访问前两行、第一列的元素
print(arr_2d[:2, 0:1])
# 混合传入整数索引与切片
# 使用切片访问前两行、第二列的元素
print(arr_2d[:2, 1])
五、数组运算
5.1 形状相同的数组间运算
无论是形状相同的数组,还是形状不同的数组,它们之间都可以执行算术运算。与Python列表不同,数组在参与算术运算时无需遍历每个元素,便可以对每个元素执行批量运算
,效率更高。
形状相同的数组在执行算术运算时,会将位置相同的元素做算术运算
,并将运算后所得的结果组成一个新数组
。
5.2 数组与常量的运算
形状相同的数组之间的任何算术运算都会应用到各元素,同样地,数组与标量执行算术运算时也会将标量应用到各元素
,以方便各元素与标量直接进行相加、相减、相乘、相除等基础操作。
六、数组操作
6.1 排序
6.1.1 reshape()函数
reshape()函数的功能是改变数组形状,可以把x维数组改成y维数组。
array1=np. array([1,2,3,4])
print(array1)
array2=array1.reshape((2,2))
print(array2)
6.1.2 ravel()函数
ravel()函数的功能是将多维数组展开为一维数组。
array1=np. array([[1,2],[3,4]])
print(array1)
array2=array1.ravel()
print(array2)
6.1.3 concatenate()函数
concatenate()函数的功能是将多个数组连接。
# 语法格式
concatenate(arr,axis)
- arr:拼接的数组,要求数组维数要一致。
- axis:默认值是0,表示在第0个维度上拼接,也可以给其赋值,拼接在指定维度上 。
array1=np.array([[1,2],[3,4]])
array2=np.array([[5,6]])
array3=np.concatenate((array1,array2))
print(array3)
array4=np.concatenate((array1,array2.T),axis=1)
print(array4)
6.1.4 delete()函数
delete()函数的功能是从数组中删除指定值。
# 语法格式
delete(arr,obj,axis)
-
arr是需要处理的矩阵;
-
obj在什么位置处理;
-
axis是一个可选参数,axis=None,1,0。
当axis=None时,arr会先按行展开,然后按照obj,删除第obj-1(从0开始)位置的数,返回一个行矩阵;当axis=0时,arr按行删除;当axis=1时,arr按列删除。
array1=np. array([[1,2],[3,4]])
array2=np. delete(array1,0)
print(array2)
array3=np. delete(array1,1,0)
print(array3)
array4=np. delete(array1,0,1)
print(array4)
6.1.5 sort()函数
sort()函数返回输入数组的排序结果。
# 语法格式
sort(axis=-1,kind=None,order=None)
- axis:表示排序的轴编号,默认为-1,代表沿着末尾的轴排序。
- kind:表示排序的算法,默认为’quicksort’(快速排序)。
- order:表示按哪个字段排序。
array1=np.array([[1,5],[6,4]])
array2=np.sort(array1)
print(array2)
array3=np.sort(array1,axis=0)
print(array3)
6.1.6 where()函数
where()函数筛选出满足条件元素的下标。
# 语法格式
where(condition,x,y)
- 满足条件condition,输出x,不满足输出y 。
- 若没有x和y,则输出满足条件(即非0)元素的坐标。
array1=np.arange(10)
array2=np.where(array1,1,-1)
print(array2)
array3=np.where(array1>4)
print(array3)
array4=array1[array3]
print(array4)
6.1.7 extract()函数
extract()和where()函数有一点类似,不过extract()函数是筛选出满足条件元素的值并返回,而不是元素索引。
array1=np.arange(10)
x=np.mod(array1,3)==0
print(x)
array2=np.extract(x,array1)
print(array2)
七、数学运算
7.1 位运算
7.1.1 bitwise_and()函数
对数组中整数的二进制形式执行按位与运算。
# 语法格式
bitwise_and(a,b)
- a和b为两个求位与运算的数字或数组
import numpy as np
array1 = np.arange(0,3)
array2 = np.arange(1,4)
np.bitwise_and(array1,array2)
7.1.2 invert()函数
对数组中整数进行按位取反运算,即0变成1,1变成0。
# 语法格式
invert(n)
- n为按位取反运算的数字
7.1.3 left_shift()函数
将数组元素的二进制形式向左移动到指定位置,右侧附加相等数量的0。
# 语法格式
left_shift(a,b)
- a为要左移的数字
- b为要左移的位数
7.2 数学函数
三角函数:sin()、cos()、tan()
反三角函数:arcsin()、arccos()和arctan()
将弧度转换为角度:degrees()函数
7.3 舍入函数
7.3.1 around()函数
返回指定数字的四舍五入值
# 语法格式
around(array,decimals)
- array表示数组
- decimals表示舍入的小数位数,默认值为0,如果为负,整数将四舍五入到小数点左侧的位置。
7.3.1 floor()函数&ceil()函数
floor()函数用于返回小于或者等于指定表达式的最大整数,即向下取整。
ceil()函数用于返回大于或者等于指定表达式的最小整数,即向上取整。
语法格式
floor(n); ceil(n)
- n为要取整的数
7.4 算术函数
add(),subtract(),multiply()和divide()是简单的加减乘除运算,也是基本的运算。
reciprocal()函数:返回参数元素的倒数。
mod()函数、remainder()函数:计算输入数组中相应元素的相除后的余数
7.4.1 power()函数
第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
# 语法格式
power(a,b)
- a作为底数
- b为幂值
7.4 统计函数
7.4 1 amax()与amin()函数、ptp()函数
最大值amax()与最小值amin()函数:用于计算数组中的元素沿指定轴的最小大值和最小值。
ptp()函数:计算数组中元素最大值与最小值的差。
array1=np.arange(10)
np.amax(array1)
np.amin(array1)
np.ptp(array1)
7.4 2 percentile()函数
计算数组中的百分位数,百分位数是统计中使用的度量,表示小于这个值的观察值的百分比。
percentile(array,q,axis)
- array是输入数组;
- q是要计算的百分位数,在0~100之间;
- axis是沿着它计算百分位数的轴
array1=np.arange(10)
np.percentile(array1,50)
7.4 3 median()函数
计算数组array中元素的中位数(中值)
array1=np.arange(10)
np.median(array1)
7.4 4 mean()函数
返回数组中元素的算术平均值。
如果提供了轴,则沿其计算。算术平均值是沿轴的元素的总和除以元素的数量。
7.4 5 average()函数
根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值;该函数可以接受一个轴参数,如果没有指定轴,则数组会被展开。加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。
7.4 6 标准差std()函数与方差var()函数
标准差是一组数据平均值分散程度的一种度量,而统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,其中,标准差是方差的平方根。
7.5 线性代数
函数 | 描述 |
---|---|
dot() | 两个数组的点积,即元素对应相乘 |
vdot() | 两个向量的点积 |
inner() | 两个数组的内积 |
matmul() | 两个数组的矩阵积 |
determinant() | 数组的行列式 |
solve() | 求解线性矩阵方程 |
inv() | 计算矩阵的乘法逆矩阵 |
7.5.1 dot()函数
对于两个一维的数组,计算的是这两个数组的乘法。
import numpy as np
a=np.array ([1,2,3,4])
b=np.array([1,2,3,4])
ans=np.dot (a, b)#1*1+2*2+3*3+4*4
print(ans)
a=np.array(([[1,2], [3,4]]) )
b=np.array(([[1,2,3], [4,5,6]]) )
aans=np.dot(a,b)#a.shape=(2,2),b.shape= (2,3),ans.shape(2,3) 即矩阵乘
print(aans)
7.5.2 vdot()函数
计算两个向量的点积。
import numpy as np
a=np.array([1,2,3,4])
b=np.array( [1,2,3,4])
ans=np. vdot (a, b) #1*1+2*2+3*3+4*4
print(ans)
7.5.3 linalg.det()函数
用于计算输入矩阵的行列式。
import numpy as np
a= np. array([[1,2], [3,4]])
ans = np.linalg. det (a) #1*4-2*3=-2
print(ans)
b= np.array([[6, 1, 1], [4,-2,5], [2,8,7]])
ans = np. linalg.det(b)
print(ans)
print(6*(-2*7-5*8)-1*(4*7 -5*2)+1*(4*8--2*2))
7.5.4 linalg.solve()函数
用于求矩阵形式的线性方程的解。
A=np.array([[2,2,2], [0,2,4], [2,5,-2]])
B=np.array([[5], [-3], [26]])
X=np. linalg. solve(A,B)#先传入A(系数矩阵),B(结果矩阵),返回解矩阵X
print("线性方程组的解:\n",X)