不用 Python 非好汉,不晓 NumPy 真遗憾
# 导入 NumPy, 开始学习
import numpy as np
NumPy 是 Numerical Python 的简称,它是目前 Python 数值计算
0 NDArray —— 多维数组对象
多维数组对象
NDArray( N-dimensional array )是学习 NumPy 的基础:
- 快速 而 灵活 的 大数据集容器
- 存储 和 变化 数据 的 主要工具
它有多快,它有多灵活?
且听我慢慢道来。
1 生成 NDArray
首先,我们可以使用 np.array()
也可使用以下的方法,我们只需将生成元素的数量传给它们:
你看这个数组,它又方又正,
我们需要一些属性去描述它。
这里有三个属性 np.ndim 、np.shape 和 np.dtype :
- np.ndim :描述数组的 维度,dimension 维度
- np.shape :表征数组每一维度的 数量
- np.dtype :描述数组的 数据类型
我们以 np.zeros()
- shape : 整数 或 整数元组 ,例如 3 或 (2,3)
- dtype : 默认为 np.float64
- order
向 np.shape 传递参数,我们就能创建 多维数组
图解 np.shape
这里补充一下, np.reshape()
图解 np.reshape()
下面是常用的 数组生成函数 :
数组生成函数
创建数组后,就可以开始以有趣的方式操作它们了。
1.2 NDArray 的数据类型
等等刹个车,
某些应用场景下,我们还需要考虑数组的 数据类型 :
- np.dtype :查看 数组 数据类型
- np.astype() : 修改 数组 数据类型
下面是常用的 NumPy 数据类型 :
NumPy 数据类型
我们还可以将 数字字符串 转换为 数字:
数字字符串 → 数字
好了,终于可以开始有趣的操作数组了。
1.3 NumPy 数组运算
讲重点了,
数组之所以 重要 是因为它允许你进行 批量操作 而无须任何 for 循环。
这种特性被称为 向量化 :
- 任何在 两个等尺寸数组 之间的算术操作都应用了 逐元素操作
让我们创建两个 NumPy 数组来展示它们的用途:
向量化 加减乘除
当然也可以进行 标量
Python 的 for 循环慢的可怕,用 向量化 计算可以快百倍。
1.4 基础索引与切片
一维数组 索引与切片
二维数组 索引与切片
值得强调的是 切片 是 左闭右开,这是个坑,
里面躺在很多人,包括我。
这里有两个概念需要说明:
- 副本:拷贝,物理内存不在同一位置
- 视图:引用,物理内存在同一位置
显然 视图 更节约内存空间,
那什么时候是“副本”,什么时候是“视图”呢?
答:
Python 序列 的 切片 属于 副本;
Numpy np.array 的 切片 属于 视图。
如果想要一份 数组切片的拷贝 而不是视图的话,就必须 显式地复制 这个数组,例如 data[1:3].copy()。
1.5 布尔索引
数组比较操作(比如 ==)也是可以 向量化
我们先创建两个数组,
一个代表姓名(name),
一个代表对应的成绩(score):
进行 布尔索引:
查看 Yellow 的成绩:
Yellow 不错呀
看看谁没有及格:
原来是 Wangcai 呀
看看不及格成绩:
可怜的 Wangcai
这里需要强调的是 布尔索引 总是生成数据的 拷贝。
1.6 神奇索引
神奇索引,一个 magical 的名字,
它是 Numpy 中的术语,用于描述使用 整数数组
神奇索引的结果总是 一维
神奇索引在赋值时,有妙用。
这里需要强调的是 神奇索引 也总是生成数据的 拷贝。
1.7 数组转置和换轴
转置 np.T
换轴 np.transpose() :
- 接受包含轴编号的元组,用于置换轴
二维数组 置换轴:
二维数组置换轴
看到这里,会想这个有什么用呢,不是转置吗?
如果有这个疑问,可以看看下面三维的使用。
三维数组 置换轴:
可以看我下面这个回答,就对三维数组巧妙地使用了 np.transpose(),实现了 图像信号信道分离 、 信道重组 :
一副图像,是(3,566,800)这种形式,如何变成(566,800,3)这样形式?www.zhihu.com
本文参考:
名称:A Visual Intro to NumPy and Data Representation 作者:Jay Alammar
名称:Python for Data Analysis 作者:Wes McKinney