Contents

Python-第三方库-Numpy

PYPI官网

numpy官网

numpy官方教程

numpy官网API文档

本文中的np表示numpy包的别名

NumPy 是 Python 中科学计算的基础包。提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。

NumPy 包的核心是ndarray对象。这封装了同构数据类型的n维数组,许多操作在编译代码中执行以提高性能。

NumPy 数组和标准 Python 序列之间有几个重要的区别:

  • 更改ndarray的大小将创建一个新数组并删除原始数组
  • NumPy 数组中的元素都需要具有相同的数据类型
  • NumPy 数组有助于对大量数据进行高级数学运算和其他类型的运算

安装

conda

1
conda install numpy

pip

1
pip install numpy

基础用法

绝对基础

类型

ndarray

  • ndim:轴数或维数
  • size:元素的总数
  • shape:每个维度存储的元素数元组
  • T:转置
  • flat:返回一个元素迭代器
  • base:值为None表示副本,否则为视图,且该值为原数组

常用函数

  • np.expand_dims():指定索引位置来插入维度
1
2
b = np.expand_dims(a, axis=0) # (1,6)
c = np.expand_dims(a, axis=1) # (6,1)
  • np.array():创建数组
  • np.unique():找到数组中的唯一元素
  • flip():选择维度反转元素
  • flatten():创建一个新的一维数组,里面是原数组的元素
  • ravel():将原数组转换为一维数组
  • save():数组保存为npy文件
  • load():导入npy文件的数组
  • savetxt():数组保存为csv文件
  • loadtxt():导入csv文件的数组

常用方法

ndarray

  • reshape():重塑数组的形状,重塑的形状元素个数需要保证不变
  • sum():返回指定维度(axis命名参数)或全部数组元素的总和
  • min():最小值
  • max():最大值
  • mean():平均值
  • prod():乘积
  • transpose():根据指定的值来反转或更改数组的轴
  • copy():新建一个副本

运算符

数组支持加减乘除

其他常用类型

np.newaxis函数用于当前位置添加一个维度

1
2
3
a = np.array([1, 2, 3, 4, 5, 6])
row_vector = a[np.newaxis, :] # (1,6)
col_vector = a[:, np.newaxis] # (6,1)

数组创建

创建数组有 6 种方法(这里列举的函数和方法都只是一部分,全部函数和方法见官网API文档):

  • 从其他 Python 结构(即列表和元组)转换:numpy.array函数,dtype定义数组元素类型比如numpy.int8类型
  • 内在的 NumPy 数组创建函数:
    • 一维数组:
      • numpy.arange():指定步长
      • numpy.linspace():指定元素个数
    • 二维数组:
      • numpy.eye():二维单位矩阵
      • numpy.diag():指定对角线和对角线元素的方形数组
    • 数组:
      • numpy.ones():全1数组
      • numpy.zeros():全0数组
      • random.Generator.random():[0.0, 1.0) 随机浮点数填充数组
  • 复制、加入或改变现有数组:
    • numpy.copy():拷贝一份数组,直接复制给另一个变量使用的仍然是同一个数组
    • numpy.vstack():纵向堆叠数组,N为数组元素个数则生成一个[1,N]的数组
    • numpy.hstack():组合多个数组,按块的方式堆叠
  • 从磁盘读取数组,无论是标准格式还是自定义格式
    • numpy.loadtxt():导入逗号分隔值 (csv) 和制表符分隔值 (tsv) 的文本文件
    • numpy.genfromtxt():从文本文件加载数据,可以指定默认值
  • 通过使用字符串或缓冲区从原始字节创建数组
  • 使用其他库的函数(例如,SciPy、Pandas 和 OpenCV)

索引

基本索引

与其他标准 Python 序列完全相同:x[0][2]

语法糖:x[0, 2] == x[0][2]

切片和步长
1
2
# start:stop:step
x[1:7:2]

NumPy 切片创建一个视图而不是副本,所以尽量同时调用copy()以生成副本,视图范围为[start,stop)

负数索引从后往前找,比如数组该维度元素个数为N,那么-k表示索引为N-k

索引超过长度则表示到数组最后一个元素

默认start为0,stop为N-1,step为1

使用与切片相同大小的其他数组对切片赋值可以设置原数组中的值

维度索引工具

np.newaxis对象来添加维度

Ellipsis对象等价于...

高级索引

高级索引总是返回数据的副本,不像切片返回视图

高级索引总是进行广播和迭代

整数数组索引

将整数数组作为索引会取整数数组中的元素作为下标来索引原数组中的元素,将索引到的元素作为一个新的数组,相当于增加一个维度

索引超出范围会抛出错误

多个整数数组作为索引并且个数小于等于原数组的维数时,每个整数数组标记一个维数,整数数组的元素个数一样表示生成的数组的元素个数

布尔数组索引

将布尔数组作为索引时,下标为true的布尔数组元素在布尔数组中的下标对应值 索引的原数组元素添加到返回数组中

作为数组与整形类似,多个布尔数组作为索引时,仍然是每一个布尔数组标记一个维度

平面迭代器索引

x.flat返回元素迭代器

为索引数组赋值

切片视图可以直接修改

1
2
3
x[2:7] = np.arange(5)
# 广播
x[2:7] = 1

如果想根据高级索引修改元素,不要使用返回值(副本),在高级索引的后面直接进行修改如:

1
2
x = np.array([1., -1., -2., 3])
x[x < 0] += 20

处理程序中可变数量的索引

Ellipsis对象或...自动填充:,如

1
2
3
4
a=np.arrange(4).reshape(2,2)
b=a[...,1]
# 等价于
b=a[:,1]

NumPy 的 I/O

genfromtxt函数从表格数据创建数组

数据类型

广播

https://numpy.org/doc/stable/_images/broadcasting_1.png
1

https://numpy.org/doc/stable/_images/broadcasting_2.png
2

https://numpy.org/doc/stable/_images/broadcasting_3.png
3

https://numpy.org/doc/stable/_images/broadcasting_4.png
4

副本和视图

更改某些元数据(如stride和dtype)而不更改数据缓冲区从而以不同方式访问数组的实现为视图

ndarray.view()方法新建一个视图

ndarray.copy()方法新建副本

切片是视图,高级索引总是创建副本

base属性判断是视图还是副本,副本返回None,视图返回原始数组

结构化数组

 |