NumPy之:ndarray中的函数

简介: NumPy之:ndarray中的函数

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])


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


x = np.random.randn(8)
y = np.random.randn(8)
x,y


(array([-2.3594, -0.1995, -1.542 , -0.9707, -1.307 ,  0.2863,  0.378 ,
        -0.7539]),
 array([ 0.3313,  1.3497,  0.0699,  0.2467, -0.0119,  1.0048,  1.3272,
        -0.9193]))


np.maximum(x, y)


array([ 0.3313,  1.3497,  0.0699,  0.2467, -0.0119,  1.0048,  1.3272,
       -0.7539])


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


arr = np.random.randn(7) * 5


array([-7.7455,  0.1109,  3.7918, -3.3026,  4.3129, -0.0502,  0.25  ])


remainder, whole_part = np.modf(arr)


(array([-0.7455,  0.1109,  0.7918, -0.3026,  0.3129, -0.0502,  0.25  ]),
 array([-7.,  0.,  3., -3.,  4., -0.,  0.]))


矢量化数组运算


如果要进行数组之间的运算,常用的方法就是进行循环遍历,但是这样的效率会比较低。


所以Numpy提供了数组之间的数据处理的方法。


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


先看一段坐标点的代码:


import numpy as np
import matplotlib.pyplot as plt
x = np.array([[0, 1, 2], [0, 1, 2]])
y = np.array([[0, 0, 0], [1, 1, 1]])
plt.plot(x, y,
         color='green',
         marker='.',
         linestyle='')
plt.grid(True)
plt.show()


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


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


看下画出来的图像:


image.png


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


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


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


上面的例子可以改写为:


x = np.array([0,1,2])
y = np.array([0,1])
xs, ys = np.meshgrid(x, y)
xs,ys
(array([[0, 1, 2],
        [0, 1, 2]]), 
 array([[0, 0, 0],
        [1, 1, 1]]))


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


有了网格坐标之后,我们就可以基于网格值来计算一些数据,比如:


sqrt(x2+y2)sqrt(x2+y2) ,我们不用变量矩阵中所有的数据,只需要直接使用数组进行运算即可:


np.sqrt(xs ** 2 + ys ** 2)


结果:


array([[0.        , 1.        , 2.        ],
       [1.        , 1.41421356, 2.23606798]])


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


条件逻辑表达式


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


xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])


result = [(x if c else y)
          for x, y, c in zip(xarr, yarr, cond)]
result


[1.1, 2.2, 1.3, 1.4, 2.5]


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


result = np.where(cond, xarr, yarr)
result


array([1.1, 2.2, 1.3, 1.4, 2.5])


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


arr = np.random.randn(4, 4)
arr
array([[ 0.7953,  0.1181, -0.7485,  0.585 ],
       [ 0.1527, -1.5657, -0.5625, -0.0327],
       [-0.929 , -0.4826, -0.0363,  1.0954],
       [ 0.9809, -0.5895,  1.5817, -0.5287]])


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


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


np.where(arr > 0, 2, -2)
array([[ 2,  2, -2,  2],
       [ 2, -2, -2, -2],
       [-2, -2, -2,  2],
       [ 2, -2,  2, -2]])


统计方法


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


arr = np.random.randn(5, 4)
arr
arr.mean()
np.mean(arr)
arr.sum()


还可以按维度来统计:


arr.mean(axis=1)
arr.sum(axis=0)


cumsum进行累加计算:


arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])
arr.cumsum()


array([ 0,  1,  3,  6, 10, 15, 21, 28])


cumprod进行累乘计算:


arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr
arr.cumsum(axis=0)


array([[ 0,  1,  2],
       [ 3,  5,  7],
       [ 9, 12, 15]])


arr.cumprod(axis=1)


array([[  0,   0,   0],
       [  3,  12,  60],
       [  6,  42, 336]])


布尔数组


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


bools = np.array([False, False, True, False])
bools.any()
True


bools.all()
False


排序


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


arr = np.random.randn(6)
arr.sort()


array([-2.5579, -1.2943, -0.2972, -0.1516,  0.0765,  0.1608])


arr = np.random.randn(5, 3)
arr
arr.sort(1)
arr


array([[-0.8852, -0.4936, -0.1875],
       [-0.3507, -0.1154,  0.0447],
       [-1.1512, -0.8978,  0.8909],
       [-2.6123, -0.8671,  1.1413],
       [-0.437 ,  0.3475,  0.3836]])


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


文件


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


arr = np.arange(10)
np.save('some_array', arr)


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


np.load('some_array.npy')


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


np.savez('array_archive.npz', a=arr, b=arr)


读取:


arch = np.load('array_archive.npz')
arch['b']


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


np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)


线性代数


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


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


x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
x
y
x.dot(y)


array([[ 28.,  64.],
       [ 67., 181.]])


或者可以这样写:


np.dot(x, y)


array([[ 28.,  64.],
       [ 67., 181.]])


还可以使用 @ 符号:


x @ y


array([[ 28.,  64.],
       [ 67., 181.]])


我们看下都有哪些运算:


乘积运算:


操作符 描述
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中随机数的生成非常简单:


samples = np.random.normal(size=(4, 4))
samples


array([[-2.0016, -0.3718,  1.669 , -0.4386],
       [-0.5397,  0.477 ,  3.2489, -1.0212],
       [-0.5771,  0.1241,  0.3026,  0.5238],
       [ 0.0009,  1.3438, -0.7135, -0.8312]])


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


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


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


np.random.seed(1234)


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


rng = np.random.RandomState(1234)
rng.randn(10)
相关文章
|
3月前
|
Python
NumPy 教程 之 NumPy 统计函数 9
NumPy提供了多种统计函数,如计算数组中的最小值、最大值、百分位数、标准差及方差等。其中,标准差是一种衡量数据平均值分散程度的指标,它是方差的算术平方根。例如,对于数组[1,2,3,4],其标准差可通过计算各值与均值2.5的差的平方的平均数的平方根得出,结果为1.1180339887498949。示例代码如下: ```python import numpy as np print(np.std([1,2,3,4])) ``` 运行输出即为:1.1180339887498949。
130 50
|
4月前
|
Python
NumPy 教程 之 NumPy 算术函数 1
本教程介绍NumPy中的基本算术函数,如加(add())、减(subtract())、乘(multiply())及除(divide())。示例展示了两个数组(一个3x3矩阵与一数组[10,10,10])间的运算。值得注意的是,参与运算的数组需有相同形状或可按照NumPy的广播规则进行扩展。此外Numpy还提供了许多其他的算术函数以满足复杂计算需求。
47 7
|
4月前
|
Python
NumPy 教程 之 NumPy 算术函数 2
NumPy 教程 之 NumPy 算术函数 2
37 3
|
4月前
|
Python
NumPy 教程 之 NumPy 数学函数 4
NumPy提供了丰富的数学函数,如三角函数、算术函数及复数处理等。本教程聚焦于舍入函数中的`numpy.ceil()`应用。该函数用于返回大于或等于输入值的最小整数(向上取整)。例如,对数组`[-1.7, 1.5, -0.2, 0.6, 10]`使用`np.ceil()`后,输出为`[-1., 2., -0., 1., 10.]`。
41 1
|
3月前
|
Python
NumPy 教程 之 NumPy 统计函数 10
NumPy统计函数,包括查找数组中的最小值、最大值、百分位数、标准差和方差等。方差表示样本值与平均值之差的平方的平均数,而标准差则是方差的平方根。例如,`np.var([1,2,3,4])` 的方差为 1.25。
106 48
|
2月前
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
58 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 8
NumPy提供了多种排序方法,包括快速排序、归并排序及堆排序,各有不同的速度、最坏情况性能、工作空间和稳定性特点。此外,NumPy还提供了`numpy.extract()`函数,可以根据特定条件从数组中抽取元素。例如,在一个3x3数组中,通过定义条件选择偶数元素,并使用该函数提取这些元素。示例输出为:[0., 2., 4., 6., 8.]。
31 8
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 2
介绍NumPy` 中的排序方法与条件筛选函数。通过对比快速排序、归并排序及堆排序的速度、最坏情况性能、工作空间需求和稳定性,帮助读者选择合适的排序算法。此外,还深入讲解了 `numpy.argsort()` 的使用方法,并通过具体实例展示了如何利用该函数获取数组值从小到大的索引值,并据此重构原数组,使得其变为有序状态。对于学习 `NumPy` 排序功能来说,本教程提供了清晰且实用的指导。
42 7
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 5
NumPy中的排序方法及特性对比,包括快速排序、归并排序与堆排序的速度、最坏情况性能、工作空间及稳定性分析。并通过`numpy.argmax()`与`numpy.argmin()`函数演示了如何获取数组中最大值和最小值的索引,涵盖不同轴方向的操作,并提供了具体实例与输出结果,便于理解与实践。
28 5
|
3月前
|
算法 索引 Python
Numpy 的一些以 arg 开头的函数
Numpy 的一些以 arg 开头的函数
53 0