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中的函数的更多相关文章

  1. python numpy 判断ndarray 中是否有 nan

    numpy.isnan(myarray).any() 下面讨论了哪一种方法的速度最快 reference: stackoverflow.com/questions/911871/detect-if-a ...

  2. 【转】python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)

    二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...

  3. python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)

    二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...

  4. 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], [ ...

  5. numpy中tile函数

    tile函数位于python模块numpy.lib.shape_base中,他的功能是重复某个数组. 函数的形式是tile(A,reps) 函数参数说明中提到A和reps都是array_like的,什 ...

  6. Numpy:ndarray数据类型和运算

    Numpy的ndarray:一种多维数组对象 N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个 ...

  7. Numpy | 02 Ndarray 对象

    NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. ndarr ...

  8. 什么是Numpy的ndarray

    什么是Numpy的ndarray 首先,Numpy的核心是ndarray. 然后,ndarray本质是数组,其不同于一般的数组,或者Python 的list的地方在于它可以有N 维(dimention ...

  9. python 在机器学习中应用函数

    浅述python中argsort()函数的用法 (1).先定义一个array数据 1 import numpy as np 2 x=np.array([1,4,3,-1,6,9]) (2).现在我们可 ...

随机推荐

  1. (二)SpringBoot启动过程的分析-环境信息准备

    -- 以下内容均基于2.1.8.RELEASE版本 由上一篇SpringBoot基本启动过程的分析可以发现在run方法内部启动SpringBoot应用时采用多个步骤来实现,本文记录启动的第二个环节:环 ...

  2. java面试-JVM内存结构

    一.JVM内存结构 二.类加载(classLoader)机制 java中的ClassLoader详解 java类加载机制面试题 java类加载机制面试题 虚拟机把描述类的数据从Class文件加载到内存 ...

  3. ES9的新特性:异步遍历Async iteration

    ES9的新特性:异步遍历Async iteration 目录 简介 异步遍历 异步iterable的遍历 异步iterable的生成 异步方法和异步生成器 简介 在ES6中,引入了同步iteratio ...

  4. SpringBoot项目war包部署

    服务部署 记录原因 将本地SpringBoot项目通过war包部署到虚拟机中,验证服务器部署. 使用war包是为了方便替换配置文件等. 工具 对象 版本 Spring Boot 2.4.0 VMwar ...

  5. Mybatis的Dao层实现原理

    1.Mybatis的Dao层实现 1.1 传统开发方式 1.1.1编写UserDao接口 public interface UserDao { List<User> findAll() t ...

  6. Windows Terminal 安装与配置

    1 安装 安装可以从应用商店安装(直接搜索即可)或者Github安装(可以戳这里): 下载msixbundle格式的文件即可直接打开安装. 2 配置前准备 2.1 下载字体 推荐使用FiraCode, ...

  7. 【cypress】3. 编写第一个测试

    当环境安装好了之后,就可以着手尝试第一个测试的编写了. 一.新建一个文件 在你的项目下的cypress/integration文件夹中创建一个新文件sample_spec.js,我这里直接在webst ...

  8. 如何在C或C++代码中嵌入ARM汇编代码

    转载自:http://blog.csdn.net/roland_sun/article/details/42921131 大家知道,用C或者C++等高级语言编写的程序,会被编译器编译成最终的机器指令. ...

  9. Windows核心编程 第十二章 纤程

    第1 2章 纤 程 M i c r o s o f t公司给Wi n d o w s添加了一种纤程,以便能够非常容易地将现有的 U N I X服务器应用程序移植到Wi n d o w s中.U N I ...

  10. Andrew Ng机器学习算法入门(十):过拟合问题解决方法

    在使用机器学习对训练数据进行学习和分类的时候,会出现欠拟合和过拟合的问题.那么什么是欠拟合和过拟合问题呢?