左滑查看目录

形状操纵

我们在创建二维数组的过程中,借助reshape()函数,将一维数组转换为矩阵 。

>>> a = np.random.random(12)>>> aarray([ 0.77841574,  0.39654203,  0.38188665,  0.26704305,  0.27519705,        0.78115866,  0.96019214,  0.59328414,  0.52008642,  0.10862692,        0.41894881,  0.73581471])>>> A = a.reshape(3, 4)>>> Aarray([[ 0.77841574,  0.39654203,  0.38188665,  0.26704305],       [ 0.27519705,  0.78115866,  0.96019214,  0.59328414],       [ 0.52008642,  0.10862692,  0.41894881,  0.73581471]])

reshape()函数返回一个新的数组,因此可以创建新对象。但是,如果要通过修改形状来修改对象,则必须将包含新尺寸的元组直接分配给它的形状attribute。

>>> a.shape = (3, 4)>>> aarray([[ 0.77841574,  0.39654203,  0.38188665,  0.26704305],       [ 0.27519705,  0.78115866,  0.96019214,  0.59328414],       [ 0.52008642,  0.10862692,  0.41894881,  0.73581471]])

这次是改变形状的起始数组,并且没有返回对象。逆运算也是可能的,即,您可以使用ravel()函数将二维数组转换为一维数组。

>>> a = a.ravel()array([ 0.77841574,  0.39654203,  0.38188665,  0.26704305,  0.27519705,        0.78115866,  0.96019214,  0.59328414,  0.52008642,  0.10862692,        0.41894881,  0.73581471])

甚至在这里直接作用于数组本身的shape属性。

>>> a.shape = (12)>>> aarray([ 0.77841574,  0.39654203,  0.38188665,  0.26704305,  0.27519705,        0.78115866,  0.96019214,  0.59328414,  0.52008642,  0.10862692,        0.41894881,  0.73581471])

另一个重要的操作是转置矩阵,该矩阵将列与行反转。NumPy启用了transpose()函数即可提供此功能 。

>>> A.transpose()array([[ 0.77841574,  0.27519705,  0.52008642],       [ 0.39654203,  0.78115866,  0.10862692],       [ 0.38188665,  0.96019214,  0.41894881],       [ 0.26704305,  0.59328414,  0.73581471]])

阵列操作

通常,我们需要使用已创建的数组再创建一个数组。 下面,你将看到如何通过联接或拆分已定义的数组来创建新数组。

连接数组

可以合并多个阵列以形成一个包含所有阵列的新阵列。NumPy使用堆栈的概念,为此提供了许多功能。 例如,可以使用vstack()函数执行垂直堆栈,该函数将第二个数组合并为第一个数组的新行。 在这种情况下,阵列沿垂直方向生长。 相比之下,hstack()函数执行水平堆叠。也就是说,第二个数组将添加到第一个数组的列中。

>>> A = np.ones((3, 3))>>> B = np.zeros((3, 3))>>> np.vstack((A, B))array([[ 1.,  1.,  1.],       [ 1.,  1.,  1.],       [ 1.,  1.,  1.],       [ 0.,  0.,  0.],       [ 0.,  0.,  0.],       [ 0.,  0.,  0.]])>>> np.hstack((A,B))array([[ 1.,  1.,  1.,  0.,  0.,  0.],       [ 1.,  1.,  1.,  0.,  0.,  0.],       [ 1.,  1.,  1.,  0.,  0.,  0.]])

另外两个函数的多个阵列之间进行堆叠是column_stack()一个 第二row_stack()。这些功能与之前的两个功能不同。通常,这些功能与一维数组一起使用,这些维数组按列或行堆叠以形成新的二维数组。

>>> a = np.array([0, 1, 2])>>> b = np.array([3, 4, 5])>>> c = np.array([6, 7, 8])>>> np.column_stack((a, b, c))array([[0, 3, 6],       [1, 4, 7],       [2, 5, 8]])>>> np.row_stack((a, b, c))array([[0, 1, 2],       [3, 4, 5],        [6, 7, 8]])

分割阵列

在上面,我们了解了如何通过堆叠组装多个阵列。现在,我们将学习如何将数组分为几个部分。在NumPy中,我们可以使用拆分来执行此操作。这里也一样,我们有一组功能的工作水平都与hsplit()函数和垂直与vsplit()函数。

>>> A = np.arange(16).reshape((4, 4))>>> Aarray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15]])

因此,如果要水平拆分数组,这意味着将数组的宽度分为两部分,则4x4矩阵A将被拆分为两个2x4矩阵。

>>> [B,C] = np.hsplit(A, 2)>>> Barray([[ 0,  1],       [ 4,  5],       [ 8,  9],       [12, 13]])>>> Carray([[ 2,  3],       [ 6,  7],       [10, 11],       [14, 15]])

相反,如果要垂直拆分数组,这意味着将数组的高度分为两部分,则4x4矩阵A将拆分为两个4x2矩阵。

>>> [B,C] = np.vsplit(A, 2)>>> Barray([[0, 1, 2, 3],       [4, 5, 6, 7]])>>> Carray([[ 8,  9, 10, 11],       [12, 13, 14, 15]])

一个更复杂的命令是split()函数,该函数允许您将数组拆分为非对称部分。将数组作为参数传递时,还必须指定要分割的零件的索引。 如果使用option axis = 1,则索引将是列;否则,索引将是列。 相反,如果选项是axis = 0,那么它们将是行索引。 例如,如果要将矩阵分为三个部分,其中第一部分将包括第一列,第二部分将包括第二和第三列,第三部分将包括最后一列,则必须在中指定三个索引以下方式。

>>> [A1,A2,A3] = np.split(A,[1,3],axis=1)>>> A1array([[ 0],       [ 4],       [ 8],       [12]])>>> A2array([[ 1,  2],       [ 5,  6],       [ 9, 10],       [13, 14]])>>> A3array([[ 3],       [ 7],       [11],       [15]])

你也可以逐行执行相同的操作。

>>> [A1,A2,A3] = np.split(A,[1,3],axis=0)>>> A1array([[0, 1, 2, 3]])>>> A2array([[ 4,  5,  6,  7],       [ 8,  9, 10, 11]])>>> A3array([[12, 13, 14, 15]])

该特征还包括functionaliti 所述的vsplit()和hsplit()函数。

Numpy的一般概念

下面内容描述了NumPy库的基本概念。副本和视图之间的区别在于它们返回值的时间。本节还介绍了在许多NumPy函数中隐式发生的广播机制。

对象的副本或视图

稍微细心一点,你在使用NumPy时就会发现,在处理数组时,你可以返回数组的副本或视图。 Numpy分配均不产生数组的副本,也不包含其中的任何元素。

>>> a = np.array([1, 2, 3, 4])>>> b = a>>> barray([1, 2, 3, 4])>>> a[2] = 0>>> barray([1, 2, 0, 4])

如果将一个数组a分配给另一个数组b,则不是要复制它。数组b只是调用数组a的另一种方法。实际上,通过更改第三个元素的值,您也可以更改b的第三个值。切片数组时,返回的对象是原始数组的视图。

>>> c = a[0:2]>>> carray([1, 2])>>> a[0] = 0>>> carray([0, 2])

如上,即使在切片时,实际上也指向同一对象。如果要生成完整且独特的数组,请使用copy()函数。

>>> a = np.array([1, 2, 3, 4])>>> c = a.copy()>>> carray([1, 2, 3, 4])>>> a[0] = 0>>> carray([1, 2, 3, 4])

在这种情况下,即使更改 数组a中的项目,数组c仍保持不变。

向量化

Vectoriz ation和广播是NumPy内部实现的基础。矢量化是指在开发代码的过程中没有明确的循环。这些循环实际上是不能省略的,而是在内部实现,然后在代码中被其他构造所取代。矢量化的应用使得代码更加简洁易读,可以说在外观上会显得更加 "Pythonic"。事实上,得益于向量化,很多操作都有了更加数学化的表达方式。例如,NumPy允许你表达两个数组的乘法,如下所示:a * b甚至两个矩阵:A * B在其他语言中,此类操作将通过许多嵌套循环和for构造来表达。例如,第一个操作将以以下方式表示:

for (i = 0; i c[i] = a[i]*b[i];}

矩阵的乘积表示如下:

for(i = 0; i for(j = 0; j c [i] [j] = a [i] [j] * b [i] [j];}

你看到了使用NumPy可使代码更具可读性和数学 性。欢迎关注Numpy中文,和我们一起学习。

numpy 索引多个_Numpy基础三,学习Python编程必备相关推荐

  1. 如何零基础学习python语言_零基础如何学习Python编程

    Python是一门简单优雅的计算机程序设计语言,相比于C语言.Java语言,Python编程具有以下特点: 1. Python语法简单,代码可读性高,容易入门: 2. Python代码具有一定的规范性 ...

  2. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)

    原标题:零基础小白学习Python编程语言的正确姿势(纯干货) 敢问有哪种编程语言集简洁.优雅.简单.全能于一身?Python绝对算的上是一个.举个例子,比如完成同一个任务,C语言需要写1000行代码 ...

  3. 零基础学python pdf-Python pdf(零基础入门学习Python)V1.0 最新版

    Python pdf(零基础入门学习Python)是一款功能强劲专业实用的Python电子书籍.想要零基础入门学习Python?那就快试试绿色先锋小编推荐的Python pdf最新版下载使用.由作者小 ...

  4. 【鱼C·零基础入门学习Python】课后习题答案 第14课

    鉴于半导体制造业进入了瓶颈,处于找不到工作的深深忧虑,故最近开始学习Python.发现鱼C工作室的<零基础入门学习python>教程很不错,视频讲解生动,最主要的是他的课后练习很不错.以下 ...

  5. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)

    小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...

  6. 《零基础入门学习Python》学习笔记(1-25)

    参考:<零基础入门学习python>http://edu.csdn.net/course/detail/906?locationNum=1&fps=1&ref=srch&a ...

  7. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  8. 0基础学python难吗-零基础入门学习Python技术难不难?

    原标题:零基础入门学习Python技术难不难? 近几年对python人才爆发式需求,导致很多人转行进入python开发行业,现如今Python这门语言的就业前景会非常好.相对于其他来说,它语法简单易读 ...

  9. 如何自学python基础-零基础如何学习python

    python是一门非常简单易懂.上手比较快的编程语言,并且它是一门开源的语言,学习python就变得十分方便.下面的内容是由浅入深,建议按照先后顺序阅读学习. 0.Python简明教程 下载地址:py ...

最新文章

  1. Firefox 的User Agent 将移除 CPU 架构信息
  2. 利用Unity3D制作简易2D计算器
  3. OpenGL基础知识
  4. JBOSS优化--比较有用的生产环境配置
  5. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )
  6. 电脑护眼设置_解锁办公新技能 海信护眼平板Q5玩转工作无负担-科技频道
  7. 力扣报错“AddressSanitizer: heap-buffer-overflow on address...”的解决办法
  8. 单片机两个正玄波信号的相位差计算_51单片机的定时器/计数器的原理与使用
  9. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
  10. c语言双精度型输出小数位数_4.1 C语言数据的输出
  11. 《必玩》!学习大师们的游戏设计经验,激发你的游戏创造力!
  12. Linux安装绿联无线网卡驱动
  13. 《iRedMail邮件服务器搭建详细过程》
  14. 2018中原工学院网络安全校赛
  15. performance 优化
  16. pta mysql训练题集(241-260)
  17. Tuner及工作原理介绍
  18. 深入理解Java虚拟机(周志明第三版)- 第十三章:线程安全与锁优化
  19. QT/C++高级编程(上)
  20. 【CC2530的点对点无线通讯开发(包含BasicRf协议栈、双击、长按、呼吸灯、跑马灯)】

热门文章

  1. fedora中linux改成英文,Fedora的英文界面下使用中文
  2. 联想y470上三代cpu_AMD三代线程撕裂者首测 单核不再是问题(二)
  3. java 电子杂志,java毕业设计_springboot框架的时尚电子杂志网站
  4. 对BottomTagFragment的理解
  5. 基于JAVA+SpringMVC+MYSQL的在线音乐网站
  6. 冰原服务器维护,12月2日服务器公告:冰原旅途进发
  7. mysql的事务隔离级别
  8. MYSQL存储过程初步认知
  9. python之路_前端基础之jQuery入门2
  10. SecurityManager篇