Python科学计算—NumPy基础(2)

  • 数学函数
  • 数组索引和切片

数学函数

使用 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

来源

发布了33 篇原创文章 · 获赞 1 · 访问量 1237

猜你喜欢

转载自blog.csdn.net/weixin_44783002/article/details/104718186