欢迎关注公众号【Python开发实战】, 获取更多内容!

工具-numpy

numpy是使用Python进行数据科学的基础库。numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变换和随机数函数。

ndarray的迭代

导入numpy

  1. import numpy as np

在ndarray的迭代与常规Python数组的迭代非常相似。但是需要住的是,多维ndarray的迭代是相对于第一个轴完成的。

  1. c = np.arange(24).reshape(2, 3, 4)
  2. c

输出:

  1. array([[[ 0, 1, 2, 3],
  2. [ 4, 5, 6, 7],
  3. [ 8, 9, 10, 11]],
  4. [[12, 13, 14, 15],
  5. [16, 17, 18, 19],
  6. [20, 21, 22, 23]]])
  1. for m in c:
  2. print('item:')
  3. print(m)

输出:

  1. item:
  2. [[ 0 1 2 3]
  3. [ 4 5 6 7]
  4. [ 8 9 10 11]]
  5. item:
  6. [[12 13 14 15]
  7. [16 17 18 19]
  8. [20 21 22 23]]
  1. for i in range(len(c)): # 这里,len(c)等于c.shape[0]
  2. print('item')
  3. print(c[i])

输出:

  1. item
  2. [[ 0 1 2 3]
  3. [ 4 5 6 7]
  4. [ 8 9 10 11]]
  5. item
  6. [[12 13 14 15]
  7. [16 17 18 19]
  8. [20 21 22 23]]

如果想要迭代ndarray中的所有元素,需要对ndarray的flat属性进行迭代。

  1. for i in c.flat:
  2. print('item: ', i)

输出:

  1. item: 0
  2. item: 1
  3. item: 2
  4. item: 3
  5. item: 4
  6. item: 5
  7. item: 6
  8. item: 7
  9. item: 8
  10. item: 9
  11. item: 10
  12. item: 11
  13. item: 12
  14. item: 13
  15. item: 14
  16. item: 15
  17. item: 16
  18. item: 17
  19. item: 18
  20. item: 19
  21. item: 20
  22. item: 21
  23. item: 22
  24. item: 23

堆叠ndarray

将不同的ndarray堆叠在一起通常很有用。numpy提供了几个函数来实现堆叠。介绍堆叠函数之前,先创建几个ndarray。

  1. q1 = np.full((3, 4), 1.0)
  2. q1

输出:

  1. array([[1., 1., 1., 1.],
  2. [1., 1., 1., 1.],
  3. [1., 1., 1., 1.]])
  1. q2 = np.full((4, 4), 2.0)
  2. q2

输出:

  1. array([[2., 2., 2., 2.],
  2. [2., 2., 2., 2.],
  3. [2., 2., 2., 2.],
  4. [2., 2., 2., 2.]])
  1. q3 = np.full((3, 4), 3.0)
  2. q3

输出:

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

vstack

vstack可以垂直堆叠ndarray,但是要满足需要堆叠的ndarray,除了垂直轴以外,即在水平轴上要具有相同的形状。

  1. q4 = np.vstack((q1, q2, q3))
  2. q4

输出:

  1. array([[1., 1., 1., 1.],
  2. [1., 1., 1., 1.],
  3. [1., 1., 1., 1.],
  4. [2., 2., 2., 2.],
  5. [2., 2., 2., 2.],
  6. [2., 2., 2., 2.],
  7. [2., 2., 2., 2.],
  8. [3., 3., 3., 3.],
  9. [3., 3., 3., 3.],
  10. [3., 3., 3., 3.]])
  1. q4.shape

输出:

  1. (10, 4)

hstack

hstack可以水平堆叠ndarray。但是要满足需要堆叠的ndarray在垂直轴上具有相同的形状。

  1. q5 = np.hstack((q1, q3))
  2. q5

输出:

  1. array([[1., 1., 1., 1., 3., 3., 3., 3.],
  2. [1., 1., 1., 1., 3., 3., 3., 3.],
  3. [1., 1., 1., 1., 3., 3., 3., 3.]])
  1. q5.shape

输出:

  1. (3, 8)
  1. try:
  2. q6 = np.hstack((q1, q2, q3))
  3. except ValueError as e:
  4. print(e)

输出:

  1. all the input array dimensions except for the concatenation axis must match exactly

concatenate

concatenate可以沿给定的现有轴进行堆叠, 故vstack相当于调用axis=0的concatenate, hstack相当于调用axis=1的concatenate。

  1. q7 = np.concatenate((q1, q2, q3), axis=0) # 相当于vstack
  2. q7

输出:

  1. array([[1., 1., 1., 1.],
  2. [1., 1., 1., 1.],
  3. [1., 1., 1., 1.],
  4. [2., 2., 2., 2.],
  5. [2., 2., 2., 2.],
  6. [2., 2., 2., 2.],
  7. [2., 2., 2., 2.],
  8. [3., 3., 3., 3.],
  9. [3., 3., 3., 3.],
  10. [3., 3., 3., 3.]])
  1. q7.shape

输出:

  1. (10, 4)
  1. q8 = np.concatenate((q1, q3), axis=1) # 相当于hstack
  2. q8

输出:

  1. array([[1., 1., 1., 1., 3., 3., 3., 3.],
  2. [1., 1., 1., 1., 3., 3., 3., 3.],
  3. [1., 1., 1., 1., 3., 3., 3., 3.]])
  1. q8.shape

输出:

  1. (3, 8)

stack

stack是沿着新轴进行堆叠,因此需要堆叠的ndarray必需具有相同的shape.

  1. q9 = np.stack((q1, q3))
  2. q9

输出:

  1. array([[[1., 1., 1., 1.],
  2. [1., 1., 1., 1.],
  3. [1., 1., 1., 1.]],
  4. [[3., 3., 3., 3.],
  5. [3., 3., 3., 3.],
  6. [3., 3., 3., 3.]]])
  1. q9.shape

输出:

  1. (2, 3, 4)
  1. try:
  2. q10 = np.stack((q1, q2))
  3. except ValueError as e:
  4. print(e)

输出:

  1. all input arrays must have the same shape

拆分ndarray

拆分ndarray与堆叠相反。

  1. r = np.arange(24).reshape(6, 4)
  2. r

输出:

  1. array([[ 0, 1, 2, 3],
  2. [ 4, 5, 6, 7],
  3. [ 8, 9, 10, 11],
  4. [12, 13, 14, 15],
  5. [16, 17, 18, 19],
  6. [20, 21, 22, 23]])

vsplit

vsplit可以垂直拆分ndarray, 下面的例子是将r垂直分成三等份。

  1. r1, r2, r3 = np.vsplit(r, 3)
  2. r1

输出:

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

输出:

  1. array([[ 8, 9, 10, 11],
  2. [12, 13, 14, 15]])
  1. r3

输出:

  1. array([[16, 17, 18, 19],
  2. [20, 21, 22, 23]])

hsplit

hsplit可以水平拆分ndarray。

  1. r4, r5 = np.hsplit(r, 2)
  2. r4

输出:

  1. array([[ 0, 1],
  2. [ 4, 5],
  3. [ 8, 9],
  4. [12, 13],
  5. [16, 17],
  6. [20, 21]])
  1. r5

输出:

  1. array([[ 2, 3],
  2. [ 6, 7],
  3. [10, 11],
  4. [14, 15],
  5. [18, 19],
  6. [22, 23]])

split

split可以沿给定的现有轴进行拆分,调用axis=0的split相当于调用vsplit,调用axis=1的split相当于调用hsplit。

  1. r6, r7 = np.split(r, 2, axis=1)
  2. r6

输出:

  1. array([[ 0, 1],
  2. [ 4, 5],
  3. [ 8, 9],
  4. [12, 13],
  5. [16, 17],
  6. [20, 21]])

转置ndarray

transpose函数是在ndarray的数据上创建一个新的视图,并按照给定顺序对轴排列。

  1. t = np.arange(24).reshape(4, 2, 3)
  2. t

输出:

  1. array([[[ 0, 1, 2],
  2. [ 3, 4, 5]],
  3. [[ 6, 7, 8],
  4. [ 9, 10, 11]],
  5. [[12, 13, 14],
  6. [15, 16, 17]],
  7. [[18, 19, 20],
  8. [21, 22, 23]]])

现在创建一个ndarray,将轴0、1、2(深度、高度、宽度)重新排列为1、2、0(高度、宽度、深度)。

  1. t1 = t.transpose((1, 2, 0))
  2. t1

输出:

  1. array([[[ 0, 6, 12, 18],
  2. [ 1, 7, 13, 19],
  3. [ 2, 8, 14, 20]],
  4. [[ 3, 9, 15, 21],
  5. [ 4, 10, 16, 22],
  6. [ 5, 11, 17, 23]]])
  1. t1.shape

输出:

  1. (2, 3, 4)

默认情况下,transpose会翻转轴的顺序。

  1. t2 = t.transpose() # 相当于t.transpose((2, 1, 0))
  2. t2

输出:

  1. array([[[ 0, 6, 12, 18],
  2. [ 3, 9, 15, 21]],
  3. [[ 1, 7, 13, 19],
  4. [ 4, 10, 16, 22]],
  5. [[ 2, 8, 14, 20],
  6. [ 5, 11, 17, 23]]])
  1. t2.shape

输出:

  1. (3, 2, 4)

numpy提供了一个方便的swapaxes来交换两个轴, 例如,创建一个深度和高度交换的ndarray。

  1. t3 = t.swapaxes(0, 1)
  2. t3

输出:

  1. array([[[ 0, 1, 2],
  2. [ 6, 7, 8],
  3. [12, 13, 14],
  4. [18, 19, 20]],
  5. [[ 3, 4, 5],
  6. [ 9, 10, 11],
  7. [15, 16, 17],
  8. [21, 22, 23]]])
  1. t3.shape

输出:

  1. (2, 4, 3)

numpy教程05---ndarray的高级操作的更多相关文章

  1. 数据分析05 /pandas的高级操作

    数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...

  2. W3School Redis教程(安装/基本操作/高级操作/命令/官方文档/官方集群教程)

    说明:Redis有自身的客户端连接软件,也可以使用Telnet进行连接操作. 来自W3School的Redis教程,基本上涵盖了从安装到状态监控的教程. W3School:https://www.gi ...

  3. W3School Memcached教程(安装/基本操作/高级操作/命令)

    来自W3School的Memcached教程,基本上涵盖了从安装到状态监控的教程. 不过最全的应该是官方提供在GitHub上的Wiki教程,一切的标准都来自官方,参考:https://github.c ...

  4. Numpy ndarray 的高级索引存在 "bug" ?

    Numpy ndarray 高级索引 "bug" ? 话说一天,搞事情,代码如下 import numpy as np tmp = [1, 2, 3, 4] * 2 a, b = ...

  5. MDN 文档高级操作进阶教程

    MDN 文档高级操作进阶教程 MDN 文档, 如何优雅的使用 MDN 文档上的富文本编辑器 pre & 语法高亮器 code & note box source code 上传附件 i ...

  6. numpy教程

    [转]CS231n课程笔记翻译:Python Numpy教程 原文链接:https://zhuanlan.zhihu.com/p/20878530 译者注:本文智能单元首发,翻译自斯坦福CS231n课 ...

  7. 转:Numpy教程

    因为用到theano写函数的时候饱受数据结构困扰 于是上网找了一篇numpy教程(theano的数据类型是基于numpy的) 原文排版更好,阅读体验更佳: http://phddreamer.blog ...

  8. Python 机器学习库 NumPy 教程

    0 Numpy简单介绍 Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy ...

  9. pandas高级操作

    pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...

  10. 【MongoDB详细使用教程】四、python操作MongoDB

    目录 1.安装pymongo 2.连接数据库 3.操作数据库 3.1.查 3.2.增 3.3.改 3.4.删 使用第三方库pymongo来实现python对MongoDB的操作 pymongo官方文档 ...

随机推荐

  1. Seastar 教程(三)

    原文:https://github.com/scylladb/seastar/blob/master/doc/tutorial.md Fiber Seastar 延续通常很短,但经常相互链接,因此一个 ...

  2. FreeBSD 利用IPFW实现限制局域网使用QQ

    QQ服务器分为三类: 1.UDP 8000端口类7个:速度最快,服务器最多.QQ上线会向这7个服务器发送UDP数据包,选择回复速度最快的一个作为连接服务器.这7个服务器名字均以sz-sz7开头,域后缀 ...

  3. JVM基本概念

    JVM基础概念 什么是JVM JVM:Java virtual machine,Java虚拟机,它是一种规范.是虚构出来的一台计算机.它可以将二进制字节码根据不同的操作系统转为当前操作系统识别的的字节 ...

  4. Mybaties——动态sql

    动态 SQL 是 MyBatis 的强大特性之一.如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表 ...

  5. Linux移植到自己的开发板(四)问题汇总

    @ 目录 1 使ubuntu支持两个版本的编译链: 2 版本问题: 3 ubuntu版本的vscode下载网速太慢: 4 ubuntu占用空间过大 5 执行make zImage 出错 lzop: n ...

  6. Django之 CBV和FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的 ...

  7. python练习册 每天一个小程序 第0001题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生 ...

  8. idea导入gitee下载的项目文件

    前一段时间在学习javaWeb时想要把gitee中的下载的项目在本地环境中跑一遍,然后根据效果再自己做出来. 但是当导入到IDEA中,配置完tomcat后一直报404错误.404是学习javaweb阶 ...

  9. XStream类对象把List<javaBean>()转成json数据

    [省市联动] Servlet端: XStream把list转成json数据 //JSONArray-->变成数组/集合[] //JSONObject-->变成简单的数据{name:ayee ...

  10. 常用写法java

    迭代器遍历[List.Set.Map] 遍历List方法一:普通for循环 1 for(int i=0;i<list.size();i++){//list为集合的对象名 2 String tem ...