• 作者:韩信子@ShowMeAI
  • 教程地址:https://www.showmeai.tech/tutorials/33
  • 本文地址:https://www.showmeai.tech/article-detail/142
  • 声明:版权所有,转载请联系平台与作者并注明出处
  • 收藏ShowMeAI查看更多精彩内容

n维数组是NumPy的核心概念,大部分数据的操作都是基于n维数组完成的。本系列内容覆盖到1维数组操作、2维数组操作、3维数组操作方法,本篇讲解Numpy与1维数组操作。

一、向量初始化

可以通过Python列表创建NumPy数组。

如图中(a),将列表元素转化为一维数组。注意,这里一般会确保列表元素类型相同,否则默认dtype=’object',会影响后续运算,甚至产生语法错误。

由于在数组末尾没有预留空间以快速添加新元素,NumPy数组无法像Python列表那样增长。因此,通常的处理方式包括:

  • 在变长Python列表中准备好数据,然后将其转换为NumPy数组
  • 使用 np.zerosnp.empty 预先分配必要的空间(图中b)

通过图中(c)方法,可以创建一个与某一变量形状一致的空数组。

不止是空数组,通过上述方法还可以将数组填充为特定值:

在NumPy中,还可以通过单调序列初始化数组:

如果我们需要浮点数组,可以使用 arange(3).astype(float) 这样的操作更改arange输出的类型,也可以在参数端使用浮点数,比如 arange(4.) 来生产浮点数Numpy数组。
以下是arange浮点类型数据可能出现的一些问题及解决方案:

图中,0.1对我们来说是一个有限的十进制数,但对计算机而言,它是一个二进制无穷小数,必须四舍五入为一个近似值。因此,将小数作为arange的步长可能导致一些错误。可以通过以下两种方式避免如上错误:

  • 使间隔末尾落入非整数步数,但这会降低可读性和可维护性;
  • 使用linspace,这样可以避免四舍五入的错误影响,并始终生成要求数量的元素。
    • 使用linspace时尤其需要注意最后一个的数量参数设置,由于它计算点数量,而不是间隔数量,因此上图中数量参数是11,而不是10。

随机数组的生成方法如下:

二、向量索引

NumPy可以使用非常直接的方式对数组数据进行访问:

图中,除“fancy indexing”外,其他所有索引方法本质上都是views:它们并不存储数据,如果原数组在被索引后发生更改,则会反映出原始数组中的更改。

上述所有这些方法都可以改变原始数组,即允许通过分配新值改变原数组的内容。这导致无法通过切片来复制数组。如下是python列表和NumPy数组的对比:

NumPy数组支持通过布尔索引获取数据,结合各种逻辑运算符可以有很高级的数据选择方式,这在Python列表中是不具备的:

注意,不可以使用3 <= a <= 5这样的Python“三元”比较。

如上所述,布尔索引是可写的。如下图 np.wherenp.clip 两个专有函数。

三、向量操作

NumPy支持快速计算,向量运算操作接近C++速度级别,并不受Python循环本身计算慢的限制。NumPy允许像普通数字一样操作整个数组:

在python中,a//b表示a div b(除法的商),x**n表示 xⁿ

浮点数的计算也是如此,NumPy能够将标量广播到数组:

Numpy提供了许多数学函数来处理矢量:

向量点乘(内积)和叉乘(外积、向量积)如下:

NumPy也提供了如下三角函数运算:

数组整体进行四舍五入:

floor向上取整,ceil向下取整,round四舍五入

np.aroundnp.round 是等效的,这样做只是为了避免 from numpy import * 时与Python around的冲突(但一般的使用方式是import numpy as np)。当然,你也可以使用a.round()。

NumPy还可以实现以下功能:

以上功能都存在相应的nan-resistant变体:例如nansumnanmax

在NumPy中,排序函数功能有所阉割:

对于一维数组,可以通过反转结果来解决reversed函数缺失的不足,但在2维数组中该问题变得棘手。

四、查找向量中的元素

NumPy数组并没有Python列表中的索引方法,索引数据的对比如下:

index()中的方括号表示 j 或 i&j 可以省略

  • 可以通过 np.where(a==x)[0] [0]查找元素,但这种方法很不pythonic,哪怕需要查找的项在数组开头,该方法也需要遍历整个数组。
  • 使用Numba实现加速查找,next((i[0] for i, v in np.ndenumerate(a) if v==x), -1),在最坏的情况下,它的速度要比where慢。
  • 如果数组是排好序的,使用v = np.searchsorted(a, x); return v if a[v]==x else -1时间复杂度为O(log N),但在这之前,排序的时间复杂度为O(N log N)。

实际上,通过C实现加速搜索并不是困难,问题是浮点数据比较。

五、浮点数比较

np.allclose(a, b)用于容忍误差之内的浮点数比较。

  • np.allclose假定所有比较数字的尺度为1。如果在纳秒级别上,则需要将默认atol参数除以1e9:np.allclose(1e-9,2e-9, atol=1e-17)==False
  • math.isclose不对要比较的数字做任何假设,而是需要用户提供一个合理的abs_tol值(np.allclose默认的atol值1e-8足以满足小数位数为1的浮点数比较,即math.isclose(0.1+0.2–0.3, abs_tol=1e-8)==True

此外,对于绝队偏差和相对偏差,np.allclose依然存在一些问题。例如,对于某些值a、b, allclose(a,b)!=allclose(b,a),而在math.isclose中则不存在这些问题。查看GitHub上的浮点数据指南和相应的NumPy问题了解更多信息。

一键运行所有代码

图解数据分析系列 配套的所有代码,可前往ShowMeAI 官方 GitHub,下载后即可在本地 Python 环境中运行。能访问 Google 的宝宝也可以直接借助 Google Colab一键运行与交互学习!

下载数据分析速查表

Awesome cheatsheets | ShowMeAI速查表大全 系列包含『编程语言』『AI技能知识』『数据科学工具库』『AI垂直领域工具库』四个板块,追平到工具库当前最新版本,并跑通了所有代码。点击 官网GitHub 获取~

图解数据分析(9) | Numpy - 与1维数组操作(数据科学家入门·完结)相关推荐

  1. 图解数据分析(10) | Numpy - 与2维数组操作(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  2. 图解数据分析(13) | Pandas - 核心操作函数大全(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  3. 图解数据分析(12) | Pandas - 数据分析工具库介绍(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  4. 图解数据分析(5) | 核心步骤2 - 数据清洗与预处理(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  5. 图解数据分析(3) | 数据分析的数学基础(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  6. 图解数据分析(1) | 数据分析介绍(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  7. NumPy 创建多维数组

    NumPy 创建多维数组 arange 函数创建的数组作为列表元素,把这个列表作为参数传给 array 函数,从而创建了一个 2 × 2 的数组,而且没有出现任何报错信息. Example 1 #!/ ...

  8. Numpy之N维数组-ndarray

    Numpy之N维数组-ndarray 1 ndarray的属性 数组属性反映了数组本身固有的信息. 属性名字 属性解释 ndarray.shape 数组维度的元组    [假如是8行5列的数组,将会返 ...

  9. boost::python模块包装几个 C++ 函数 将二维数组操作为采用 NumPy 数组的 Python 函数作为参数

    boost::python模块包装几个 C++ 函数 将二维数组操作为采用 NumPy 数组的 Python 函数作为参数 实现功能 C++实现代码 实现功能 boost::python模块包装几个 ...

最新文章

  1. 提高CSDN阅读量。需要写出好文章。新技术的笔记!
  2. matlab对图像进行增强,利用matlab对图像进行增强处理.doc
  3. 知乎热议:高数、线代应该成为计算机专业学习的重心吗?
  4. 题目1169:比较奇偶数个数
  5. tab栏切换 动画的相关方法上 动画的相关方法下 隐藏动画案例 隐藏动画练习
  6. 使用 Tye 辅助开发 k8s 应用竟如此简单(五)
  7. VB用API实现各种对话框(总结)(转载)
  8. 添加一列_Joom平台CSV文件如何添加产品?CSV文件添加产品流程一览
  9. oneproxy mysql_在OneProxy的基础上实行MySQL读写分离与负载均衡
  10. Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程
  11. 松鼠症 知识过载与疲于奔命
  12. java课程设计 华容道_Java课设-数字华容道
  13. 【WPS表格】斜线表头的制作
  14. 自适应滤波(LMS,RLS)
  15. android softkeyboard,如何以编程方式关闭Android Soft KeyBoard?
  16. spring data redis 配置
  17. 中国股票下跌是有道理的(基金经理:现在我们不能买股票 )
  18. 江苏省计算机一级考试知识点总结,江苏省计算机一级考试的内容是什么啊?
  19. 196套日系风和PPT模板,你想要的都在这里
  20. 西门子6ES7134-6JD00-0CA1的技术参数

热门文章

  1. 更换路由器后,内网服务器无法访问或非常卡顿 channel is not opened.
  2. 搭建kubernetes v1.21.5 和 kubesphere v3.2.1
  3. 大学英语B---阅读理解
  4. C++ Reference: Standard C++ Library reference: C Library: cctype: isspace
  5. pnpm ERR_PNPM_ADDING_TO_ROOT
  6. 《都挺好》迎来大结局——大数据告诉你《都挺好》到底有多火
  7. iphone6s计算机驱动,将iphone6s连接到计算机时如果出现驱动程序问题该怎么办
  8. oracle+12514+C#,Oracle10g ORA-12514
  9. 获取图片中牙套的长脚
  10. 图片与十六进制之间的相互转换