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 的函数组成. ndarray 是 NumPy 核心概念

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

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

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

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

  1. 组成了 ndarray 的 scalar

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


数据类型


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

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

数据类型

对象类型 np.object_

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

数字类型 np.number

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

  2. int_ : 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)

  3. intc : 与 C 的 int 类型一样,一般是 int32 或 int64

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

  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 一致

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


索引与切片


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

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


多维索引


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

多维索引


更新 ndarray


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


索引进阶


整数数组索引

使用一个整数数组(list, tuple 或 ndarray)来切割

整数数组索引

条件索引

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

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() 是求伪逆