摘要
NumPy中的涵数能够加速计算速率,除了基本算术计算外,还有很多有效的涵数。让我们来看看这些涵数,它们能够让我们的计算机更快地运行。
正文
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])
取2个二维数组的最高值,构成新的二维数组:
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.]))
矢量化二维数组计算
假如要开展二维数组中间的计算,常见的方式 便是开展循环系统解析xml,可是那样的高效率会较为低。因此 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轴的部位。
看看画出去的图象:
上边绘制的便是应用X,Y引流矩阵组成出去的6个座标点。
上边的X,Y的二维数组是大家手动式键入的,假如座标上边有很多点得话,手动式键入肯定是不可取的。
因此拥有np.meshgrid这一涵数。这一涵数能够 接纳2个一维的二维数组,随后转化成二维的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(x^2 y^2)\) ,大家无需自变量引流矩阵中全部的数据信息,只必须立即应用二维数组开展计算就可以:
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) | 2个二维数组的内积 |
outer(a, b[, out]) | 2个向量的外积 |
matmul(x1, x2, /[, out, casting, order, …]) | 2个引流矩阵的相匹配位的相乘 |
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, …]) | svd分解 |
本征值和本征空间向量:
实际操作 | 叙述 |
---|---|
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)
文中已收录与 http://www.flydean.com/10-python-numpy-func/
最简单的讲解,最深入的干货知识,最简约的实例教程,诸多你永远不知道的小窍门等着你发觉!
热烈欢迎关注我的微信公众号:「程序流程那些事儿」,懂技术性,更懂你!
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0