1、简介
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,它是Python科学计算的基本包,除了具有科学用途外,还可以作为通用数据的高效多维容器。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
相关链接
- NumPy 官网 http://www.numpy.org/
- NumPy 源代码:https://github.com/numpy/numpy
2、安装
pip install numpy
3、ndarray对象
NumPy 的主要对象是 N 维数组对象 ndarray
,其中 nd 表示 n 维。它是一系列同类型数据
的集合,以 0 下标
为开始进行集合中元素的索引。
NumPy 维度(dimension)被称为轴(axis), 很好理解:有几个轴就是几维数组,符合平时生活中有 x, y 两个坐标轴就是二维空间,再加上 z 轴就是三维空间的概念。
例如,3D 空间中的点的坐标 [ 1,2,1 ] 具有一个轴。这个轴有3个元素,即该轴的长度是3。在下面的例子中,数组有两个轴。第一轴的长度为2,第二轴的长度为3。
[[ 1., 0., 0.], [ 0., 1., 2.]]
通俗一点理解:就是多维数组中有几个中括号
[]
就是几维,就有一个轴
3.1 基本的构造函数
对于创建 numpy.ndarray,官网上给出了多种创建方式,这里介绍更为常见的两种:
- 从 python 数据结构中转化而来,比如 list, tuple 等,
np.array(obj)
返回np.ndarray
对象 - 固有的 NumPy ndarray 创建方式,比如 np.arange(), np.ones(), np.zeros() 等,返回
np.ndarray
对象
# 导入numpy包import numpy as np# 从Python中数据结构中转化而来a = np.array([1, 2, 3])print("a: ", a) # a: [1 2 3]# 固有的 NumPy ndarray 创建方式b = np.arange(3)print("b:", b) # b: [0 1 2]
3.2 基本属性
ndim
Number of array dimensions.shape
数组的形状size
数组元素总数dtype
一个用来描述数组中元素类型的对象。我们可以使用 Python 标准类型来创建指定该对象,NumPy 也提供了自己的类型,如 numpy.int32, numpy.int16, and numpy.float64等itemsize
数组中每个元素的字节大小T
转置数组
c = np.array([[1, 2, 3], [4, 5, 6]])# 数组维度c.ndim # 2# 数组形状c.shape # (2, 3)# 数组元素个数c.size # 6# 数组中元素类型c.dtype # dtype('int32')# 数组的转置c.T# array([[1, 4],# [2, 5],# [3, 6]])
4、一维数组
4.1 创建数组
1、np.array() 直接创建
2、使用 np.ones()、np.zeros() 等方法
我们在写数组的时候是横着写的,而其实数组是列向量,这样很直观。
4.2 数组运算
1、加减乘除
2、数组乘以数值
3、数组索引
4、数组聚合
上面是一维数组,下面介绍二维维数组也就是矩阵的使用技巧。
5、矩阵
5.1 创建矩阵
1、直接创建
2、使用 np.ones()、np.zeros() 等方法
5.2 矩阵运算
5.3 矩阵点积
矩阵点积跟线性代数基本一样,有些抽象,借助示意图能很好理解:
进一步拆分解释:
5.4 矩阵索引
5.5 矩阵聚合
1、求最值
2、按列 / 行聚合
5.6 矩阵转置
5.7 矩阵重塑
6、高维数组
6.1 创建多维数组
当您打印三维NumPy数组时,文本输出显示数组的方式与此处不同。NumPy用于打印n维数组的顺序是,最后一个轴是最快的,而第一个是最慢的。这意味着
np.one((4,3,2))
将被打印为:
array([[[1., 1.], [1., 1.], [1., 1.]], [[1., 1.], [1., 1.], [1., 1.]], [[1., 1.], [1., 1.], [1., 1.]], [[1., 1.], [1., 1.], [1., 1.]]])
7. 基本方法
- 以下所称的数组均是
np.ndarray
对象 a
,b
均为(3 * 4)
的数组
7.1 比较操作
a == b返回一个
(3 * 4)布尔类型的数组
c,若
a[i, j] == b[i, j],则
c[i, j] = True,否则为
False
7.2 数据类型转换
a.astype(np.Type)
7.3 形状操作
a.flatten()
ora.ravel()
将其展开成一维数组a.reshape()
ora.resize()
将其重设数组的shape
a.transpose()
转置数组
7.4 合并
np.vstack((a, b))
ornp.concatenate((a, b), axis=0)
纵向合并np.hstack((a, b))
ornp.concatenate((a, b), axis=1)
水平合并np.dstack((a, b))
深度合并,会返回一个(3 * 4 * 2)
的数组np.column_stack()
np.row_stack()
7.5 切分
np.hsplit(a, 4)
np.vsplit(a, 3)
np.dsplit(np.dstack((a, b)), 4)
np.split(a, axis=0)
8、实战
实现处理矩阵和向量的数学公式是NumPy的关键用例。这就是为什么NumPy是科学巨蟒社区的宠儿。例如,均方误差公式MSE
,它是处理回归问题的有监督机器学习模型的核心:
在NumPy实现这一点很容易:
这一点的好处在于,NumPy并不关心预测值和标签是否包含一个或一千个值(只要它们的大小相同)。我们可以通过一个示例,依次遍历该代码行中的四个操作:
预测和标签向量都包含三个值。也就是说n的值是3。在我们进行减法运算之后,得到的值如下所示:
然后我们可以将向量中的值平方:
现在我们将这些值相加:
9、参考链接
- Numpy教程
- A Visual Intro to NumPy and Data Representation