index

ndarray数组基本结构和操作

写在前面

人生苦短,我用python。

为什么使用ndarray:

  • 基础数据结构
  • 效率比list高,底层C
  • 支持矩阵运算
  • 广播机制,兼容不同维度数组的加法

一、创建ndarray(四种)

  • np.array(list):从list/tuple创建
  • np.arrange(start,stop,interval):创建序列
  • np.zero([d1,d2,...]):创建指定维度的全0矩阵(浮点
  • np.ones([d1,d2,...]):创建指定维度的全1矩阵(浮点

二、属性操作(六个)

  • arr.size:数组形状,即(x,y,z)(返回元组)
  • arr.dtype:数据类型
  • arr.size:元素个数,即x*y*z
  • arr.ndim:维度大小,即len(x,y,z)
  • arr.astype(np.int64):改变数据类型
  • arr.reshap(m,n):改变形状

三、基本运算(七个)

  • +加, -减, *乘, /除, //向下取整除,%模, **乘方
  • 标量和ndarray数组之间的运算(所有元素进行运算)
  • 两个ndarray数组之间的运算(对应位置元素进行运算)
  • /还可以当作分隔符,分隔但不中断语句

四、索引和切片

1. 一维数组

  • 一维数组跟Python列表的功能类似
  • 区别:数组切片还是指向原来的内存区域
  • 将值赋值给一个切片时,该值会自动传播到整个切片
  • 如何复制数据?:使用arr=np.copy(arr)

2. 多维数组

  • 在多维数组中,各索引位置上的元素不再是标量而是多维数组
  • 以逗号隔开的索引列表来选取单个元素:arr[a][b]等价于arr[a,b]
  • 在多维数组中,如果省略了后面的索引,则返回对象会是一个低维数组

3. 查找索引

五、统计方法(七类)

对整个数组或某个轴向的数据进行统计计算。 以下方法既可以当做数组的实例方法,也可以当做Numpy函数使用

  • mean:计算算术平均数,零长度数组的mean为NaN。
  • stdvar:计算标准差和方差,自由度可调(默认为n)。
  • sum:对数组中全部或某轴向的元素求和,零长度数组的sum为0。
  • maxmin:计算最大值和最小值。
  • argminargmax:分别为最大和最小元素的索引。
  • cumsum:计算所有元素的累加。
  • cumprod:计算所有元素的累积。

六、随机数np.random

1. 创建随机ndarray数组

  • 设置随机数种子
  • 均匀分布
  • 正态分布

2. 随机打乱ndarray数组

  • 随机打乱1维ndarray数组顺序,发现所有元素位置都被打乱了
  • 随机打乱2维ndarray数组顺序,发现只有行的顺序被打乱了,列顺序不变

3. 随机选取元素(一维)

七、线性代数

线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分,Numpy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。

  • diag:以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)。
  • dot:矩阵乘法。注意:b.dot(c)等价于np.dot(b,c)
  • trace:计算对角线元素的和。
  • linalg.det:计算矩阵行列式。
  • linalg.eig:计算方阵的特征值和特征向量。
  • linalg.inv:计算方阵的逆。

八、文件读写与保存

1. 文本读取

Numpy可以方便的进行文件读写,如下面这种格式的文本文件:

文本数据

2. 文件保存

Numpy提供了save和load接口,直接将数组保存成文件(保存为.npy格式),或者从.npy文件中读取数组。

九、Numpy应用举例

1. 计算激活函数Sigmoid和ReLU

使用ndarray数组可以很方便的构建数学函数,并利用其底层的矢量计算能力快速实现计算。下面以神经网络中比较常用激活函数Sigmoid和ReLU为例,介绍代码实现过程。

relu和sigmoid函数图像

2. 图像翻转和裁剪

图像是由像素点构成的矩阵,其数值可以用ndarray来表示。将上述介绍的操作用在图像数据对应的ndarray上,可以很轻松的实现图片的翻转、裁剪和亮度调整,具体代码和效果如下所示。

lotus

lotus_01

lotus_02

lotus_03

lotus_04

lotus_05

lotus_06

lotus_07

lotus_08

lotus_09

lotus_10