为什么使用NumPy而不是list

  1. list的元素在系统内存中是分散存储的,而NumPy数组存储在一个均匀连续的内存块中。这样数组在遍历时不像list需要对内存地址进行查找,从而节省了计算资源。
  2. 在内存访问模式中,缓存会直接把字节块从RAM加载到CPU寄存器中,因为数据连续地存储在内存中,NnumPy直接利用现代CPU的矢量化指令计算,加载寄存器中的多个连续浮点数。
  3. NumPy中的矩阵运算可以采用多线程的方式,充分利用多核CPU计算资源,大大提升了计算效率。

ndarray对象(N-dimensional array object)

ndarray实际上是多维数组的含义。在NumPy数组中,维数称为秩(rank)。

创建数组

直接通过np.array()创建数组。

可以通过shape属性获得数组的大小,通过dtype获得元素的属性。

结构数组

类似于C语言中的结构体,我们可以在NumPy中定义结构类型。下面给出一个学生成绩管理的例子。可以看出,我们分别在“names”和“formats”声明需要的字段和数据类型即可。

import numpy as np

persontype = np.dtype({
    'names':['name', 'age', 'chinese', 'math', 'english'],
    'formats': ['S32', 'i', 'i', 'i', 'f']})

在创建结构数组时,按照定义的结构类型赋值,一条数据作为一个tuple,最后声明dtype为定义的结构类型即可。

peoples = np.array([("ZhangFei", 32, 75, 100, 90), ("GuanYu", 24, 85, 96, 88.5),
                ("ZhaoYun", 28, 85, 92, 96.5), ("HuangZhong", 29, 65, 85, 100)],
                dtype=persontype)

ages = peoples[:]['age']
chinese = peoples[:]['chinese']
maths = peoples[:]['math']

unfunc运算(universal function)

NumPy中很多unfunc函数,能对数组中的元素进行操作,计算速度非常快,因为是采用C语言实现的。

连续数组的创建

  1. np.arrange():通过指定初始值、终值、步长来创建等差数列的一维数组。
  2. np.linspace():通过指定初始值、终值、元素个数来创建等差数列的一维数组。

算数运算

  1. 加:np.add(x1, x2)
  2. 减:np.subtract(x1, x2)
  3. 乘:np.multiply(x1, x2)
  4. 除:np.divide(x1, x2)
  5. 幂:np.power(x1, x2)
  6. 取余:np.remainder(x1, x2)或np.mod(x1, x2)

统计函数

  1. 求数组中全部元素最大值:np.max(x)或np.amax(x)
  2. 求数组中全部元素最小值:np.min(x)或np.amin(x)
  3. 求数组中某一轴(维)的最大值:np.max(x, axis=0)或np.amax(x, axis=0)(axis=0表示沿着行,求每列的最大值)
  4. 求数组中某一轴(维)的最小值:np.min(x, axis=0)或np.amin(x, axis=0)
  5. 统计最大值与最小值之差:np.ptp(x)
  6. 统计某一维的最大值与最小值之差:np.ptp(x, axis=0)
  7. 统计数组的百分位数:np.percentile(x, p)(p的取值范围为0~ 100,如果p=0,等价于求最小值;如果p=100,等价于求最大值)
  8. 统计数组某一维的百分位数:np.percentile(x, p, axis=0)
  9. 统计数组中的中位数:np.median(x)(也有沿着某一维的用法,略)
  10. 统计数组中的平均数:np.mean(x)(也有沿着某一维的用法,略)
  11. 统计数组中的加权平均值:np.average(x, weights=wts)(默认情况下,每个元素权重相同,可以自定义wts,也有沿着某一维的用法,略)
  12. 统计数组中的标准差:np.std(x)(也有沿着某一维的用法,略)
  13. 统计数组中的方差:np.var(x)(也有沿着某一维的用法,略)

排序

np.sort(a, axis=-1, kind=‘quicksort’, order=None)

  1. axis:默认是-1,沿着数组最后一维排序,可以是axis=None,将数组铺平作为一个向量排序;
  2. kind:可以指定“quicksort”、“mergesort”、“heapsort”分别对应快速排序、合并排序、堆排序;
  3. order:对于结构化的数组可以指定按照某个字段进行排序。