10-python-numpy-func

10. NumPy之:ndarray中的函数

简介

在NumPy中,多维数组除了基本的算数运算之外,还内置了一些非常有用的函数,可以加快我们的科学计算的速度。

简单函数

我们先看下比较常见的运算函数,在使用之前,我们先构造一个数组:

arr = np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

计算数组中元素的开方:

np.sqrt(arr)
array([0.    , 1.    , 1.4142, 1.7321, 2.    , 2.2361, 2.4495, 2.6458,
       2.8284, 3.    ])

自然常数e为底的指数函数:

np.exp(arr)
array([   1.    ,    2.7183,    7.3891,   20.0855,   54.5982,  148.4132,
        403.4288, 1096.6332, 2980.958 , 8103.0839])

取两个数组的最大值,组成新的数组:

返 回浮点数数组的小数和整数部分:

矢量化数组运算

如果要进行数组之间的运算,常用的方法就是进行循环遍历,但是这样的效率会比较低。所以Numpy提供了数组之间的数据处理的方法。

先来讲解一下 np.meshgrid 这个函数,这个函数是用来快速生成网格点坐标矩阵的。

先看一段坐标点的代码:

上面的X是一个二维数组,表示的是坐标点的X轴的位置。

Y也是一个二维数组,表示的是坐标点的Y轴的位置。

看下画出来的图像:

上面画出的就是使用X,Y矩阵组合出来的6个坐标点。

上面的X,Y的二维数组是我们手动输入的,如果坐标上面有大量点的话,手动输入肯定是不可取的。

于是有了np.meshgrid这个函数。这个函数可以接受两个一维的数组,然后生成二维的X,Y坐标矩阵。

上面的例子可以改写为:

可以看到生成的xs和ys和手动输入是一样的。

有了网格坐标之后,我们就可以基于网格值来计算一些数据,比如:$sqrt(x^2+y^2)$ ,我们不用变量矩阵中所有的数据,只需要直接使用数组进行运算即可:

结果:

因为xs 和ys本身就是2 * 3 的矩阵,所以结果也是 2 * 3 的矩阵。

条件逻辑表达式

我们可以在构建数组的时候使用条件逻辑表达式:

更简单一点,我们可以使用where语句:

我们还可以根据where的条件来修改数组的值:

上面我们构建了一个4 * 4 的数组。

我们可以在where中进行数据的比较,如果大于0,将数据修改成2 ,如果小于0,则将数据修该成-2 :

统计方法

numpy提供了mean,sum等统计方法:

还可以按维度来统计:

cumsum进行累加计算:

cumprod进行累乘计算:

布尔数组

any用于测试数组中是否存在一个或多个True,而all则检查数组中所有值是否都是True:

排序

使用sort可以对数组进行排序,除了普通排序还可以按照特定的轴来进行排序:

sort(1)指的是按照第二个轴来排序。

文件

可以方便的将数组写入到文件和从文件中读出:

会将数组存放到some_array.npy文件中,我们可以这样读取:

还可以以无压缩的方式存入多个数组:

读取:

如果想要压缩,可以这样:

线性代数

如果我们使用普通的算数符来进行矩阵的运算的话,只是简单的数组中对应的元素的算数运算。如果我们想做矩阵之间的乘法的时候,可以使用dot。

一个 2 * 3 的矩阵 dot 一个3*2 的矩阵,最终得到一个2 * 2 的矩阵。

或者可以这样写:

还可以使用 @ 符号:

我们看下都有哪些运算:

乘积运算:

操作符
描述

dot(a, b[, out])

矩阵点积

linalg.multi_dot(arrays, *[, out])

多个矩阵点积

vdot(a, b)

向量点积

inner(a, b)

两个数组的内积

outer(a, b[, out])

两个向量的外积

matmul(x1, x2, /[, out, casting, order, …])

两个矩阵的对应位的乘积

tensordot(a, b[, axes])

计算沿指定轴的张量点积

einsum(subscripts, *operands[, out, dtype, …])

爱因斯坦求和约定

einsum_path(subscripts, *operands[, optimize])

通过考虑中间数组的创建,评估einsum表达式的最低成本收缩顺序。

linalg.matrix_power(a, n)

矩阵的幂运算

kron(a, b)

矩阵的Kronecker乘积

分解运算:

操作符
描述

linalg.cholesky(a)

Cholesky 分解

linalg.qr(a[, mode])

计算矩阵的qr因式分解

linalg.svd(a[, full_matrices, compute_uv, …])

奇异值分解

本征值和本征向量:

操作
描述

linalg.eig(a)

计算方阵的特征值和右特征向量。

linalg.eigh(a[, UPLO])

返回复数Hermitian(共轭对称)或实对称矩阵的特征值和特征向量。

linalg.eigvals(a)

计算通用矩阵的特征值。

linalg.eigvalsh(a[, UPLO])

计算复数Hermitian(共轭对称)或实对称矩阵的特征值。

基准值:

操作
描述

linalg.norm(x[, ord, axis, keepdims])

矩阵或向量范数

linalg.cond(x[, p])

Compute the condition number of a matrix.

linalg.det(a)

矩阵行列式

linalg.matrix_rank(M[, tol, hermitian])

使用SVD方法返回数组的矩阵秩

linalg.slogdet(a)

计算数组行列式的符号和(自然)对数。

trace(a[, offset, axis1, axis2, dtype, out])

返回沿数组对角线的和。

求解和反转:

操作
描述

linalg.solve(a, b)

求解线性矩阵方程或线性标量方程组。

linalg.tensorsolve(a, b[, axes])

对x求解张量方程'a x = b'。

linalg.lstsq(a, b[, rcond])

将最小二乘解返回线性矩阵方程

linalg.inv(a)

计算矩阵的(乘法)逆。

linalg.pinv(a[, rcond, hermitian])

计算矩阵的(Moore-Penrose)伪逆。

linalg.tensorinv(a[, ind])

计算N维数组的“逆”。

随机数

很多时候我们都需要生成随机数,在NumPy中随机数的生成非常简单:

上面用normal来得到一个标准正态分布的4×4样本数组。

使用np.random要比使用Python自带的随机数生成器要快得多。

np.random可以指定生成随机数的种子:

numpy.random的数据生成函数使用了全局的随机种子。要避免 全局状态,你可以使用numpy.random.RandomState,创建一个 与其它隔离的随机数生成器:

本文已收录于 www.flydean.com

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

最后更新于

这有帮助吗?