NumPy 是一个用于科学计算的 Python 库,全称为 Numerical Python,它提供了支持多维数组和矩阵运算的强大工具,还包含了许多用于数组操作的高效函数。它是 Python 数据分析和科学计算的基础库之一,常与其他库(如 SciPy、Pandas、Matplotlib)搭配使用。
引入numpy库:
1 | import numpy as np |
Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象ndarray
,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray
对象是用于存放同类型元素的多维数组。ndarray
中的每个元素在内存中都有相同存储大小的区域。
NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。
具体,Ndarray数组有以下属性:
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray 对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | ndarray 元素的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
ndarray的创建
通过 array
从已有数组中创建
1 | numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0) |
1 | ## 一维数组 |
通过arange
从数值范围创建数组
1 | numpy.arange(start, stop, step, dtype) |
1 | np.arange(5) |
通过numpy.linspace
创建一个由等差数列构成的一维数组
1 | np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) |
1 | np.linspace(1,10,10) |
通过numpy.logspace
创建一个由等比数列构成的一维数组
1 | np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) |
1 | np.logspace(1.0, 2.0, num=10) |
生成特殊形式数组
生成全0数组(zeros()
函数),生成全1数组(ones()
函数), 仅分配内存但不初始化的数组(empty()
函数)
1 | numpy.empty(shape, dtype = float, order = 'C') |
1 | np.empty([3,2], dtype=int) |
numpy.zeros_like
创建一个与给定数组具有相同形状的数组,数组元素以 0 来填充。
1 | numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None) |
与此类似的,还有numpy.ones_like
切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice
函数,并设置 start
, stop
及 step
参数进行,从原数组中切割出一个新数组。
1 | a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) |
条件索引:
1 | import numpy as np |
具体来说,b > 0
是一个布尔型的数组,其中的元素是根据条件 b > 0
是否满足来决定的,对于满足条件的元素,其对应的位置上的值为 True
,否则为 False
。
然后,b[b > 0]
则是使用这个布尔型数组作为索引,从数组 b 中选择所有满足条件的元素,组成一个新的数组。
数组操作
修改数组形状
1 | reshape # 不改变数据的条件下修改形状 |
1 | ndarray.reshape(newshape, order='C')) |
翻转数组
1 | transpose # 对换数组的维度,转置 |
1 | a = np.arange(12).reshape(3,4) |
数组元素的添加与删除
1 | resize # 返回指定形状的新数组 |
1 | numpy.resize(arr, shape) |
NumPy 数学函数
三角函数
NumPy 提供了标准的三角函数:sin()
、cos()
、tan()
。
舍入函数numpy.around()
函数返回指定数字的四舍五入值。numpy.floor()
返回小于或者等于指定表达式的最大整数,即向下取整。numpy.ceil()
返回大于或者等于指定表达式的最小整数,即向上取整。
算术函数
加减乘除: add()
,subtract()
,multiply()
和 divide()
numpy.reciprocal()
函数返回参数逐元素的倒数。如 1/4 倒数为 4/1。numpy.power()
函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。numpy.mod()
计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder()
也产生相同的结果。
NumPy 线性代数
dot
两个数组的点积,即元素对应相乘。vdot
两个向量的点积inner
两个数组的内积matmul
两个数组的矩阵积determinant
数组的行列式solve
求解线性矩阵方程inv
计算矩阵的乘法逆矩阵