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轴的位置。
看下画出来的图像:
上面画出的就是使用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(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) | 两个数组的内积 |
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)
本文已收录于 http://www.flydean.com/10-python-numpy-func/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
NumPy之:ndarray中的函数的更多相关文章
- python numpy 判断ndarray 中是否有 nan
numpy.isnan(myarray).any() 下面讨论了哪一种方法的速度最快 reference: stackoverflow.com/questions/911871/detect-if-a ...
- 【转】python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...
- python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...
- python中numpy库ndarray多维数组的的运算:np.abs(x)、np.sqrt(x)、np.modf(x)等
numpy库提供非常便捷的数组运算,方便数据的处理. 1.数组与标量之间可直接进行运算 In [45]: aOut[45]:array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ ...
- numpy中tile函数
tile函数位于python模块numpy.lib.shape_base中,他的功能是重复某个数组. 函数的形式是tile(A,reps) 函数参数说明中提到A和reps都是array_like的,什 ...
- Numpy:ndarray数据类型和运算
Numpy的ndarray:一种多维数组对象 N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个 ...
- Numpy | 02 Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. ndarr ...
- 什么是Numpy的ndarray
什么是Numpy的ndarray 首先,Numpy的核心是ndarray. 然后,ndarray本质是数组,其不同于一般的数组,或者Python 的list的地方在于它可以有N 维(dimention ...
- python 在机器学习中应用函数
浅述python中argsort()函数的用法 (1).先定义一个array数据 1 import numpy as np 2 x=np.array([1,4,3,-1,6,9]) (2).现在我们可 ...
随机推荐
- 给Nginx配置日志格式和调整日期格式
效果对比 官方默认日志格式 # 官方默认日志格式 log_format main '$server_name $remote_addr - $remote_user [$time_local] &qu ...
- 全网最详细的Linux命令系列-cat命令
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 命令格式: cat [选项] [文件].. ...
- 《基于Kubernetes舵手集群的设计与实现》
前言 <基于Kubernetes舵手集群的设计与实现>是我的毕业设计项目.本系统采用Kubernetes容器编排.基于Jenkins\Gitlab的CICD技术.EFK日志收集.Prome ...
- 使用pr进行视频的剪辑
本人作为一个经常浪迹在各个小视频的网站的视频界"gai溜子",很是喜欢一些人上传的综艺或者电影的搞笑搞笑小桥段,有的剪辑下来的片段甚至会比我们自己去看还要有意思的多.我认为视频剪辑 ...
- MySQL-一条sql语句的执行顺序
手写: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_tab ...
- AgileConfig - 轻量级配置中心1.2.0发布,全新的UI✨✨✨
AgileConfig自发布以来有个"大问题"-UI太丑.因为当初这个项目是给自己用的,连UI界面都没有,全靠手动在数据库里改配置.后来匆匆忙忙使用bootstrap3简单的码了一 ...
- Spring Boot自动配置原理
使用Spring Boot之后,一个整合了SpringMVC的WEB工程开发,变的无比简单,那些繁杂的配置都消失不见了,这 是如何做到的? 一切魔力的开始,都是从我们的main函数来的,所以我们再次来 ...
- .NET管道应用——工作池
名词解释 工作池:一组等待任务分配的线程.一旦完成了所分配的任务,这些线程可继续等待任务的分配. .NET管道:命名空间System.Threading.Channels中的Channel和Chann ...
- day-6 xctf-hello_pwn
xctf-hello_pwn 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&i ...
- [Vue warn]: Unknown custom element: <terminal-process> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
Vue组件注册报错问题 import 不要加{},排查出如果页面引用单个组件的时候不要加上{}中括号,引入多个组件时才能派上用场,中括号去除问题即可解决.