- 数学函数
- 数组索引和切片
数学函数
使用 Python 自带的运算符,你可以完成数学中的加减乘除,以及取余、取整,幂次计算等。导入自带的 math 模块之后,里面又包含绝对值、阶乘、开平方等一些常用的数学函数。不过,这些函数仍然相对基础。如果要完成更加复杂一些的数学计算,就会显得捉襟见肘了。
(1) 三角函数
numpy.sin(x):三角正弦。
numpy.cos(x):三角余弦。
numpy.tan(x):三角正切。
numpy.arcsin(x):三角反正弦。
numpy.arccos(x):三角反余弦。
numpy.arctan(x):三角反正切。
numpy.hypot(x1,x2):直角三角形求斜边。
numpy.degrees(x):弧度转换为度。
numpy.radians(x):度转换为弧度。
numpy.deg2rad(x):度转换为弧度。
numpy.rad2deg(x):弧度转换为度。
(2) 双曲函数
numpy.sinh(x):双曲正弦。
numpy.cosh(x):双曲余弦。
numpy.tanh(x):双曲正切。
numpy.arcsinh(x):反双曲正弦。
numpy.arccosh(x):反双曲余弦。
numpy.arctanh(x):反双曲正切。
(3) 数值修约
数值修约, 又称数字修约, 是指在进行具体的数字运算前, 按照一定的规则确定一致的位数, 然后舍去某些数字后面多余的尾数的过程。比如, 我们常听到的「4 舍 5 入」就属于数值修约中的一种。
numpy.around(a):平均到给定的小数位数。
numpy.round_(a):将数组舍入到给定的小数位数。
numpy.rint(x):修约到最接近的整数。
numpy.fix(x, y):向 0 舍入到最接近的整数。
numpy.floor(x):返回输入的底部。
numpy.ceil(x):返回输入的上限。
numpy.trunc(x):返回输入的截断值。
a = np.random.randn(5) # 生成 5 个随机数
a # 输出 a 的值
> array([-0.36063527, 0.48682976, -0.4143421 , 0.21499006, 0.25709575])
np.around(a)
> array([-0., 0., -0., 0., 0.])
np.rint(a)
> array([-0., 0., -0., 0., 0.])
np.fix(a)
> array([-0., 0., -0., 0., 0.])
(4) 求和、求积、差分
numpy.prod(a, axis, dtype, keepdims):返回指定轴上的数组元素的乘积。
numpy.sum(a, axis, dtype, keepdims):返回指定轴上的数组元素的总和。
numpy.nanprod(a, axis, dtype, keepdims):返回指定轴上的数组元素的乘积, 将 NaN 视作 1。
numpy.nansum(a, axis, dtype, keepdims):返回指定轴上的数组元素的总和, 将 NaN 视作 0。
numpy.cumprod(a, axis, dtype):返回沿给定轴的元素的累积乘积。
numpy.cumsum(a, axis, dtype):返回沿给定轴的元素的累积总和。
numpy.nancumprod(a, axis, dtype):返回沿给定轴的元素的累积乘积, 将 NaN 视作 1。
numpy.nancumsum(a, axis, dtype):返回沿给定轴的元素的累积总和, 将 NaN 视作 0。
numpy.diff(a, n, axis):计算沿指定轴的第 n 个离散差分。
numpy.ediff1d(ary, to_end, to_begin):数组的连续元素之间的差异。
numpy.gradient(f):返回 N 维数组的梯度。
numpy.cross(a, b, axisa, axisb, axisc, axis):返回两个(数组)向量的叉积。
numpy.trapz(y, x, dx, axis):使用复合梯形规则沿给定轴积分。
(5) 指数和对数
numpy.exp(x):计算输入数组中所有元素的指数。
numpy.log(x):计算自然对数。
numpy.log10(x):计算常用对数。
numpy.log2(x):计算二进制对数。
(6) 算数运算
numpy.add(x1, x2):对应元素相加。
numpy.reciprocal(x):求倒数 1/x。
numpy.negative(x):求对应负数。
numpy.multiply(x1, x2):求解乘法。
numpy.divide(x1, x2):相除 x1/x2。
numpy.power(x1, x2):类似于 x1^x2。
numpy.subtract(x1, x2):减法。
numpy.fmod(x1, x2):返回除法的元素余项。
numpy.mod(x1, x2):返回余项。
numpy.modf(x1):返回数组的小数和整数部分。
numpy.remainder(x1, x2):返回除法余数。
a1 = np.random.randint(0, 10, 5) # 生成 5 个从 0-10 的随机整数
a2 = np.random.randint(0, 10, 5)
a1, a2 # 输出 a1, a2
> (array([5, 0, 8, 2, 0]), array([7, 8, 7, 1, 4]))
np.add(a1, a2)
> array([12, 8, 15, 3, 4])
np.negative(a1)
> array([-5, 0, -8, -2, 0])
np.multiply(a1, a2)
> array([35, 0, 56, 2, 0])
np.divide(a1, a2)
> np.divide(a1, a2)
np.power(a1, a2)
> array([ 78125, 0, 2097152, 2, 0])
(7) 矩阵和向量积
numpy.dot(a, b):求解两个数组的点积。
numpy.vdot(a, b):求解两个向量的点积。
numpy.inner(a, b):求解两个数组的内积。
numpy.outer(a, b):求解两个向量的外积。
numpy.matmul(a, b):求解两个数组的矩阵乘积。
numpy.tensordot(a, b):求解张量点积。
numpy.kron(a, b):计算 Kronecker 乘积。
numpy.angle(z, deg)
:返回复参数的角度。
numpy.real(val)
:返回数组元素的实部。
numpy.imag(val)
:返回数组元素的虚部。
numpy.conj(x)
:按元素方式返回共轭复数。
numpy.convolve(a, v, mode)
:返回线性卷积。
numpy.sqrt(x)
:平方根。
numpy.cbrt(x)
:立方根。
numpy.square(x)
:平方。
numpy.absolute(x)
:绝对值, 可求解复数。
numpy.fabs(x)
:绝对值。
numpy.sign(x)
:符号函数。
numpy.maximum(x1, x2)
:最大值。
numpy.minimum(x1, x2)
:最小值。
numpy.nan_to_num(x)
:用 0 替换 NaN。
numpy.interp(x, xp, fp, left, right, period)
:线性插值。
(8) 代数运算
numpy.linalg.cholesky(a)
:Cholesky 分解。
numpy.linalg.qr(a ,mode)
:计算矩阵的 QR 因式分解。
numpy.linalg.svd(a ,full_matrices,compute_uv)
:奇异值分解。
numpy.linalg.eig(a)
:计算正方形数组的特征值和右特征向量。
numpy.linalg.eigh(a, UPLO)
:返回 Hermitian 或对称矩阵的特征值和特征向量。
numpy.linalg.eigvals(a)
:计算矩阵的特征值。
numpy.linalg.eigvalsh(a, UPLO)
:计算 Hermitian 或真实对称矩阵的特征值。
numpy.linalg.norm(x ,ord,axis,keepdims)
:计算矩阵或向量范数。
numpy.linalg.cond(x ,p)
:计算矩阵的条件数。
numpy.linalg.det(a)
:计算数组的行列式。
numpy.linalg.matrix_rank(M ,tol)
:使用奇异值分解方法返回秩。
numpy.linalg.slogdet(a)
:计算数组的行列式的符号和自然对数。
numpy.trace(a ,offset,axis1,axis2,dtype,out)
:沿数组的对角线返回总和。
numpy.linalg.solve(a, b)
:求解线性矩阵方程或线性标量方程组。
numpy.linalg.tensorsolve(a, b ,axes)
:为 x 解出张量方程 a x = b
numpy.linalg.lstsq(a, b ,rcond)
:将最小二乘解返回到线性矩阵方程。
numpy.linalg.inv(a)
:计算逆矩阵。
numpy.linalg.pinv(a ,rcond)
:计算矩阵的(Moore-Penrose)伪逆。
numpy.linalg.tensorinv(a ,ind)
:计算 N 维数组的逆。
数组索引和切片
数组索引
(1)
a = np.arange(10) # 生成 0-9
a[1] # 获取索引值为 1 的数据
a[[1, 2, 3]] # 分别获取索引值为 1,2,3 的数据
(2)
a = np.arange(20).reshape(4, 5)
a[1, 2] # 获取第 2 行,第 3 列的数据
# Python 中 list 索引 2 维数据的方法正确的做法是a[1][2]
a = a.tolist()
a[1][2]
a = np.arange(20).reshape(4, 5)
> array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
a[[1, 2], [3, 4]]
> array([ 8, 14])
# 这里需要注意索引的对应关系。我们实际获取的是 [1, 3],也就是第 2 行和第 4 列对于的值 8。以及 [2, 4],也就是第 3 行和第 5 列对应的值 14。
(3)
a = np.arange(30).reshape(2, 5, 3)
> array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]],
[[15, 16, 17],
[18, 19, 20],
[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])
a[[0, 1], [1, 2], [1, 2]]
> array([ 4, 23])
数组切片
Ndarray[start:stop:step]
:[start:stop:step]
分别代表 [起始索引:截至索引:步长]
。
对于一维数组:
a = np.arange(10)
a[:,5]
a[5:10]
a[0:10:2]
对于多维数组,我们只需要用逗号 ,
分割不同维度即可:
a = np.arange(20).reshape(4,5)
a[0:3,2:4] # 先取第 3,4 列,再取第 1,2,3 行
a[:,::2] # 按步长为 2 取所有列和所有行的数据。
排序
numpy.sort(a, axis=-1, kind='quicksort', order=None)
a
:数组。
axis
:要排序的轴。如果为None
,则在排序之前将数组铺平。默认值为 -1
,沿最后一个轴排序。
kind
:{'quicksort','mergesort','heapsort'}
,排序算法。默认值为 quicksort
。
a = np.random.rand(20).reshape(4,5)
array([[0.4067026 , 0.02296533, 0.06435257, 0.99077083, 0.46672518],
[0.73621431, 0.3910597 , 0.72614588, 0.55235663, 0.75587185],
[0.38226065, 0.42122671, 0.02584968, 0.38518907, 0.62174531],
[0.22214217, 0.00723674, 0.29625144, 0.85690794, 0.58018676]])
np.sort(a)
array([[0.02296533, 0.06435257, 0.4067026 , 0.46672518, 0.99077083],
[0.3910597 , 0.55235663, 0.72614588, 0.73621431, 0.75587185],
[0.02584968, 0.38226065, 0.38518907, 0.42122671, 0.62174531],
[0.00723674, 0.22214217, 0.29625144, 0.58018676, 0.85690794]])
numpy.lexsort(keys ,axis)
:使用多个键进行间接排序。
numpy.argsort(a ,axis,kind,order)
:沿给定轴执行间接排序。
numpy.msort(a)
:沿第 1 个轴排序。
numpy.sort_complex(a)
:针对复数排序。
搜索和计数
argmax(a ,axis,out)
:返回数组中指定轴的最大值的索引。
nanargmax(a ,axis)
:返回数组中指定轴的最大值的索引,忽略 NaN。
argmin(a ,axis,out)
:返回数组中指定轴的最小值的索引。
nanargmin(a ,axis)
:返回数组中指定轴的最小值的索引,忽略 NaN。
argwhere(a)
:返回数组中非 0 元素的索引,按元素分组。
nonzero(a)
:返回数组中非 0 元素的索引。
flatnonzero(a)
:返回数组中非 0 元素的索引,并铺平。
where(条件,x,y)
:根据指定条件,从指定行、列返回元素。
searchsorted(a,v ,side,sorter)
:查找要插入元素以维持顺序的索引。
extract(condition,arr)
:返回满足某些条件的数组的元素。
count_nonzero(a)
:计算数组中非 0 元素的数量。
a = np.random.randint(0, 10, 20)
array([8, 7, 3, 8, 0, 9, 3, 0, 5, 6, 6, 9, 4, 4, 5, 4, 5, 3, 5, 2])
np.argmax(a)
5
np.argmin(a)
4
np.nonzero(a)
(array([ 0, 1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19]),)
np.count_nonzero(a)
18