形状操作

首先导入numpy库

>>> import numpy as np

改变数组的形状

数组的形状由每个维度的元素的数量决定。

>>> a = np.floor(10*np.random.random((3,4)))

>>> a

array([[7., 1., 0., 7.],

[7., 3., 3., 4.],

[3., 9., 2., 9.]])

>>> a.shape #数组的形状

(3, 4)

数组的形状能够通过很多命令改变。以下的三个命令都能返回一个被改变的数组,但是并不改变原数组。

>>> a.ravel() # 返回被平坦化的数组

array([7., 1., 0., 7., 7., 3., 3., 4., 3., 9., 2., 9.])

>>> a.reshape(6,2) # 返回一个改变形状的数组

array([[7., 1.],

[0., 7.],

[7., 3.],

[3., 4.],

[3., 9.],

[2., 9.]])

>>> a.T # 返回一个被转置的数组

array([[7., 7., 3.],

[1., 3., 9.],

[0., 3., 2.],

[7., 4., 9.]])

>>> a.T.shape

(4, 3)

>>> a.shape # 原数组的形状不变

(3, 4)

ravel()返回结果的元素顺序一般来说C语言的风格,也就是说,最右的维度先变化,所以,返回结果的排列是a[0,0]之后是a[0,1]。如果数组的形状改变了,依然会采用c语言风格的处理方式。NumPy一般生成数组在内存中就是按照这种顺序存储,所以ravel()一般不会复制参数,但是如果数组是通过切片或其他非一般的方式创建的,可能就需要复制了。ravel()和reshape()函数也可以通过设置一个可选参数使用FORTRAN语言风格,这二种风格下,最左的维度先变化。

reshape函数返回的是改变了形状数组,而resize方法改变的是数组本身的形状。

>>> a

array([[7., 1., 0., 7.],

[7., 3., 3., 4.],

[3., 9., 2., 9.]])

>>> a.resize((2,6))

>>> a # resize 之后,a的形状变了,这是与reshape的区别

array([[7., 1., 0., 7., 7., 3.],

[3., 4., 3., 9., 2., 9.]])

如果一个维度被设置为-1,那么这个维度的大小将会自动计算。

>>> a.reshape(3,-1)

array([[7., 1., 0., 7.],

[7., 3., 3., 4.],

[3., 9., 2., 9.]])

堆叠不同的数组

多个数组能够沿着不同维度被堆叠在一起。

>>> a = np.floor(10*np.random.random((2,2)))

>>> a

array([[7., 8.],

[1., 2.]])

>>> b = np.floor(10*np.random.random((2,2)))

>>> b

array([[7., 4.],

[2., 6.]])

>>> np.vstack((a,b))

array([[7., 8.],

[1., 2.],

[7., 4.],

[2., 6.]])

>>> np.hstack((a,b))

array([[7., 8., 7., 4.],

[1., 2., 2., 6.]])

column_stack函数将一维数组看做列向量堆叠成二维数组。当被堆叠的数组是二维时,它的作用与hstack一样。

>>> from numpy import newaxis

>>> np.column_stack((a,b)) # 使用column_stack堆叠二维数组和上面我们使用hstack时得到的结果一样

array([[7., 8., 7., 4.],

[1., 2., 2., 6.]])

>>> a = np.array([4.,2.])

>>> b = np.array([3.,8.])

>>> np.column_stack((a,b)) # 当被堆叠的数组是一维数组时,返回的结果还是二维数组

array([[4., 3.],

[2., 8.]])

>>> np.hstack((a,b)) # 使用hstack堆叠一维数组,返回的还是一维数组,这是与column_stack的不同

array([4., 2., 3., 8.])

>>> a[:,newaxis] # 通过newaxis能够为数组添加维度

array([[4.],

[2.]])

>>> np.column_stack((a[:,newaxis],b[:,newaxis]))

array([[4., 3.],

[2., 8.]])

>>> np.hstack((a[:,newaxis],b[:,newaxis])) # 添加维度之后再使用hstack就可以得到和column_stack一样的结果

array([[4., 3.],

[2., 8.]])

另外,对于任意数组row_stack与vstack的作用相同。通常,对于大于二维的数组,hstack作用在第二个维度上,而vstack作用在第一个维度上,而concatenate函数允许用户通过设置一个可选参数决定连接应该发生在哪个维度。

注意

在一些复杂的情况下, 使用r_ 和 c_ 创建数组非常实用. 他们允许使用范围表达符号:

>>> np.r_[1:4,0,4]

array([1, 2, 3, 0, 4])

当作用在数组时,r_ 和 c_ 的作用与vstack和hstack一样,但是允许我们通过可选参数决定连接发生在哪个维度。

将数组拆分为更小的数组

使用hsplit,你可以沿着水平方向拆分数组,即可以通过指定平均切分的数量,也可以通过指定切分的列来实现。

>>> a = np.floor(10*np.random.random((2,12)))

>>> a

array([[0., 2., 5., 6., 0., 2., 0., 2., 1., 5., 6., 2.],

[3., 3., 2., 3., 6., 8., 8., 5., 6., 2., 0., 2.]])

>>> np.hsplit(a,3) # 延水平方向切分为3个相同大小的数组

[array([[0., 2., 5., 6.],

[3., 3., 2., 3.]]), array([[0., 2., 0., 2.],

[6., 8., 8., 5.]]), array([[1., 5., 6., 2.],

[6., 2., 0., 2.]])]

np.hsplit(a,(3,4)) # 从第3第4列切分a

[array([[0., 2., 5.],

[3., 3., 2.]]), array([[6.],

[3.]]), array([[0., 2., 0., 2., 1., 5., 6., 2.],

[6., 8., 8., 5., 6., 2., 0., 2.]])]

vsplit沿着垂直方向切分,array_split 可以指定沿着哪个维度切分。

复制与Views

当操作数组时,有时候数据被复制到一个新的数组,而有时候又没有。这经常困扰新手,以下是三种情况。

不复制

简单的赋值语句不会复制数组对象或者他们的值。

>>> a = np.arange(12)

>>> b = a # 简单的赋值不会复制新的对象

>>> b is a # a和b是同一个数组的两个不同的名称而已

True

>>> b.shape = 3,4 # 改变b的话也会改变a

>>> a.shape

(3, 4)

Python将可变对象作为引用传递,因此函数调用不会复制。

>>> def f(x):

... print(id(x))

...

>>> id(a) # id是一个对象的唯一标识符

4557575552

>>> f(a) # 将a传入函数f,不会复制a

4557575552

View或者浅复制

不同的数组对象能够共享相同的数据。view方法创建一个新的数组对象,这个对象与原始数组使用相同的数据。

>>> c = a.view() # c是a的view,或者说c是a的浅复制,c是另一个对象

>>> c is a

False

>>> c.base is a # 确切的说,c是数值的view,数值的属于a

True

>>> c.flags.owndata #所以c的数值并不属于c

False

>>> c.shape = 2,6 # 如果改变c的形状,并不影响a

>>> a.shape

(3, 4)

>>> c[0,4] = 1234 # 但是,如果改变c的数值,a也会受影响

>>> a

array([[ 0, 1, 2, 3],

[1234, 5, 6, 7],

[ 8, 9, 10, 11]])

以上在python中称作view,或者叫浅复制,切片操作就会返回一个view:

>>> s = a[ : , 1:3] # s是a的切片

>>> s[:] = 10 # 改变s的值也会影响a

>>> a

array([[ 0, 10, 10, 3],

[1234, 10, 10, 7],

[ 8, 10, 10, 11]])

深复制

copy方法生成一个数组的完整备份。

>>> d = a.copy() # 生成一个新的数组对象

>>> d is a

False

>>> d.base is a # d与a不共享任何数值

False

>>> d[0,0] = 9999 #改变d的数值,也不会影响a

>>> a

array([[ 0, 10, 10, 3],

[1234, 10, 10, 7],

[ 8, 10, 10, 11]])

函数和方法一览

其他有用的方法列表可以查看这里Routines

python科学计算教学_Python最好用的科学计算库:NumPy快速入门教程(二)相关推荐

  1. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  2. python notebook软件_Jupyter notebook快速入门教程(推荐)

    本文主要介绍了Jupyter notebook快速入门教程,分享给大家,具体如下: 本篇将给大家介绍一款超级好用的工具:Jupyter notebook. 为什么要介绍这款工具呢? 如果你想使用Pyt ...

  3. python快速入门教程-终于理解python快速入门教程

    跟Java语言一样,python语言也有类的概念,直接使用class关键字定义python类.在python类,定义类的方法.然后直接使用类的初始化调用自身,获取相应的属性.以下是小编为你整理的pyt ...

  4. 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记1:第一章 NumPy快速入门

    NumPy快速入门 1.1 Python NumPy是基于Python的,因此在安装NumPy之前,需要先安装Python.某些操作系统已经默认安装有Python环境,但仍需检查Python的版本是否 ...

  5. python快速入门答案-总算懂得python脚本快速入门教程

    PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...

  6. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  7. numpy安装_Python进阶之NumPy快速入门(一)

    前言 NumPy是Python的一个扩展库,负责数组和矩阵运行.相较于传统Python,NumPy运行效率高,速度快,是利用Python处理数据必不可少的工具. 这个NumPy快速入门系列分为四篇,包 ...

  8. python脚本教程-总算懂得python脚本快速入门教程

    PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...

  9. python快速入门【二】----常见的数据结构

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

最新文章

  1. HashMap 为什么线程不安全?
  2. weblogic介绍
  3. linux c 删除非空目录
  4. 苹果宣布创立欧洲首个iOS开发中心
  5. GraphPad Prism(医学绘图) v9.1.2.226 for Win
  6. Spring Data JPA教程:简介
  7. 汇顶软件开发初面总结20180921
  8. OpenCV学习笔记(三):多通道图像分离、混合算子:split(),merge()
  9. 多线程下HttpContext.Current 的问题
  10. python3.7魔塔游戏_基于Funcode平台的“火锅版魔塔”游戏开发与设计
  11. 2层框架结构柱子间距_3分钟牢记框架结构要点
  12. 关于模型转向自然化思考
  13. Android带LOGO二维码生成
  14. 文件传输工具WinSCP下载安装教程
  15. oracle数据库怎么查实例名,查询oracle数据库实例的名字
  16. 苹果safari浏览器video视频无法播放
  17. 照片查看器找不见的解决办法
  18. SPI 通信协议 最详细解读!!!
  19. 使用Easyar在unity制作ar视频黑屏
  20. 多个PDF怎么合并?赶快看这篇文章学习一下

热门文章

  1. 巴赛尔协议与贷款产品利率解析
  2. Linux进程3——虚拟地址访问
  3. ActiveMQ的消息的(含附件)发送和接收使用
  4. 浅析:浅拷贝 及 深拷贝的传统写法
  5. [bbk2228] 第41集 - Chapter 11-SQL Statement Tuning(00)
  6. MANIFEST.MF
  7. Infragistics NetAdvantage UltraGrid的使用
  8. SQL 智能提示工具
  9. readonly 与 const
  10. 【UDP通过多线程改进,在一个窗口中同时接收又发送】