NumPy is a library for the Python programming language, adding support for large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays.


多维数组 ndarray


NumPy 主要由多维数组 ndarray (一个用来储存同一种数据类型的有序容器), 和用来操纵 ndarry 的函数组成. ndarrayNumPy 核心概念

ndarray 中的元素的可以是整数, 浮点数, 固定长度的字符串, 等等, 还可以是任何 Python 对象的 reference (并不储存对象本身) 这些元素称为标量 scalar

ndarrays 是同质的:即其所有元素在内存中占据了同样的大小,每一个元素的数据类型对象dtype是一样的

ndarray 中的元素可以用整数(位置)来索引,这和 list 很像, 但 ndarray 可以是多维的 (有多个轴 axis)

一个 ndarray 在计算机内存中由两个部分组成:

  1. 组成了 ndarrayscalar

  2. ndarray 的头文件, 定义了数组中 scalar 唯一的数据类型


数据类型


ndarray 中的元素的可以是整数,浮点数,字符串,等等,还可以是任何 Python 对象的 reference (并不储存对象本身)。与数组对应,这些元素统称为标量 scalar

以下是这些标量的数据类型对象之间的继承关系:

数据类型

对象类型 np.object_

  1. object_ : 任何 Python 对象的 reference ,而非对象本身。但是在使用时会返回这个对象本身

数字类型 np.number

  1. bool_ : 布尔型数据类型(True 或者 False)

  2. int_ : 默认的整数类型(类似于 C 语言中的 longint32int64

  3. intc : 与 C 的 int 类型一样,一般是 int32int64

  4. intp : 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32int64

  5. int8 : 字节(-128 to 127)

  6. int16 : 整数(-32768 to 32767)

  7. int32 : 整数(-2147483648 to 2147483647)

  8. int64 : 整数(-9223372036854775808 to 9223372036854775807)

  9. uint8 : 无符号整数(0 to 255)

  10. uint16 : 无符号整数(0 to 65535)

  11. uint32 : 无符号整数(0 to 4294967295)

  12. uint64 : 无符号整数(0 to 18446744073709551615)

  13. float_ : float64 类型的简写

  14. float16 : 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位

  15. float32 : 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位

  16. float64 : 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位

  17. complex_ : complex128 类型的简写,即 128 位复数

  18. complex64 : 复数,表示双 32 位浮点数(实数部分和虚数部分)

  19. complex128 : 复数,表示双 64 位浮点数(实数部分和虚数部分)

字符类型 np.character

  1. str_ : 字符串

  2. unicode_ : unicode 字符串,默认是 UTF8,支持中文

它们的方法和属性与 Python 原生的 str 一致

有些标量的数据类型对象 dtypePython 中的基本数据类型对象 int, float, str, bool 概念上是一样的,两者也可以很容易地互相转换和比较数值大小,但是他们是不同的对象


索引与切片


numpy 保留了 Python 中索引与切片的操作,并且可以针对多维数组

索引会返回一个 scalar,切片会返回一个 ndarray


多维索引


不同维度之间用“,”隔开。

多维索引


更新 ndarray


只需对该 ndarray 做索引,并对结果“赋值”。可以使用一个 scalar 更新,也可以使用另一个 ndarray 更新,但需要注意 shapedtype 是否匹配


索引进阶


整数数组索引

使用一个整数数组(list, tuplendarray)来切割

整数数组索引

条件索引

使用逻辑表达式来筛选数组中的元素

1
2
3
4
5
6
7
import numpy as np

x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9,10,11]])
print('我们的数组是:')
print(x)
print('大于 5 的元素是:')
print(x[x > 5])

一些条件筛选函数

  1. np.argmax(), np.argmin() : 返回沿给定轴最大和最小元素的索引

  2. np.nonzero() : 返回输入数组中非零元素的索引

  3. np.where() : 返回输入数组中满足给定条件的元素的索引

  4. np.extract() : 根据某个条件从数组中抽取元素,返回满条件的元素


数组的维度与轴 Axis


ndarray 的维度 ndim 即指明了其轴的数量。0 轴定义为“最里面”的那个一维数组。


改变 ndarray 的形状


通过 .reshape() 方法可以改变数组的形状。


加轴


np.newaxis : 在使用这句话的位置增加一条轴

1
2
3
4
5
6
7
import numpy as np

a = np.zeros(10)
b = a[:, np.newaxis]
print(b)
c = a[np.newaxis, :]
print(c)


广播


当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制

广播的规则:

  1. 输出数组的形状是输入数组形状的各个维度上的最大值

  2. 输入数组的每个轴和输出数组的对应轴的长度相同, 或者该轴长度为 1

  3. 输入数组若维度低于输出数组,那么在该数组的形状前加1直至补齐

  4. 输入数组若某轴的长度为1,则沿着此轴运算时都用此轴上的第一组值


随机数


  1. np.random.rand(d0, d1, d2) : 从 uniform 分布中抽出形状为 (d0, d1, d2) 的样本数组,形状为空则返回标量

  2. np.random.randn(d0, d1, d2) : 从标准正态分布中抽出形状为 (d0, d1, d2) 的样本数组,形状为空则返回标量

  3. np.random.RandomState() : 固定随机状态允许我们复现某一次随机过程的结果。实例化一个 RandomState 对象, 此后我们可以用这个对象替代 np.random 来调用 np.random 下的函数, 比如 np.random.rand


常用方法


  1. np.unique() : 不重复元素

  2. np.sort() : 排序

  3. np.argsort() : 按照元素值的大小将索引排序

  4. np.bincount() : 自然数数组中各元素的频次

  5. .T : 转置

  6. np.linalg.inv() : 求逆矩阵,np.linalg.pinv() 是求伪逆