NumPy是Numeric Python的缩写,一个优秀的开源科学计算库。
个人理解,NumPy是一个主要围绕着数值数组对象(ndarray)(或叫做矩阵)进行各种操作的对象、函数集合。提供很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等。
Numpy主要用于数据分析、科学计算、深度学习、人工智能等领域,学习的难度很大一部分理解这些领域中的概念。
NumPy的主要对象是同构多维数组。它是一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。在NumPy中维度称为轴。NumPy包的核心是ndarray对象。这是封装了同质数据类型的n维数组。
这里要熟悉几个数学上的名词:
标量、向量、矩阵、张量和转置
标量(scalar):标量就是一个单独的数,例如数字1、2、1.1、1.2都是标量;
向量(vector):一个向量可以看作是一组标量形成的一维数组,例如由 n 个实数组成的向量 x 为:
x = [x 1 , x 2 , … , x n]
可以把向量看作空间中的点,向量中的每个元素是不同坐标轴上的坐标。
矩阵(matrix):矩阵是一个二维数组,其中的每一个元素被两个索引(行和列)所确定。矩阵A的例子如下所示
张量(tensor):张量是多维数组。零维数组就是标量,一维数组就是向量,二维数组就是矩阵,多维数组就是张量。
转置(transpose):矩阵的转置可以看作是将矩阵按主对角线翻转过来(也就是行变列,列变行),矩阵 A 的转置常用 来表示。主对角线是指从左上角到右下角的那条对角线。
NumPy的主要对象是同构多维数组,那就涉及到如何构建对象,如生成向量(一维数组)、矩阵(二维数组),张量(三维及以上数组),以及对这些数组的操作。
数据的维度: 一组数据的组织形式
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织。对应列表、数组和集合等概念。
列表和数组:一组数据的有序结构。二者的区别:
列表:数据类型可以不同,即列表中元素的类型可以不同。
数组:数据类型相同,即数组中元素的类型相同。
二维数据:由多个一维数据构成,是一维数据的组合形式。
表格是典型的二维数据。其中,表头是二维数据的一部分。
多维数据:由一维或二维数据在新维度上扩展形成。
高维数据:仅利用最基本的二元关系展示数据间的复杂结构。如Python中的字典dict,JSON、XML等半结构化数据文件。
数据维度的Python表示:数据维度是数据的组织形式
一维数据:列表和集合类型,list、tuple、set:list=[1,2,3]
二维数据:列表类型:list = [ [1,2],[3,4],[5,6]]
多维数据:列表类型:list = [ [ [1,2],[3,4]],[ [5,6],[7,8] ] ]
高维数据:字典类型 或数据表示格式JSON、XML和YAML
NumPy的数组对象:ndarray——N维数组对象
Python已有列表类型,为什么需要一个数组对象(类型)?
• 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
• 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
观察: 科学计算中,一个维度所有数据的类型往往相同
• 数组对象采用相同的数据类型,有助于节省运算和存储空间
ndarray是一个多维数组对象,由两部分构成:
• 实际的数据
• 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。
在NumPy中,生成ndarray实例使用array方法,即ndarray在程序中的别名是array:
轴(axis): 保存数据的维度;秩(rank):轴的数量。
在NumPy中,维度称为轴。轴的数目(也即维度的数目)为rank,秩。
这里的概念很不好理解,我的简单理解就是所谓的秩,就是中括号嵌套的深度,如[ 1 2 3 ],一维数组,中括号只有一层,秩就是1,而8是单个数字,秩就是0,没有中括号,[ [1 2] [3 4]],中括号嵌套了2层,秩就是2。维度,或者说轴,用axis表示,秩是2,表示是二维的,或两个轴,轴号就是0和1,轴号从0开始,到秩-1。0轴是最外层的中括号,以次向内。
假设这个数组变量为p,那么p.sum()=276,就是所有元素相加的和,即0+1+2+...+23=276
p.sum(axis=0),就是把红线的相加,最后剩下蓝线和黑线结构,即结果是二维数组(2,3)
p.sum(axis=1),就是把蓝线相加,最后剩下红线和黑线结构,结果是二维数组(4,3):
p.sum(axis=2),就是把黑线相加,最后剩下红线和蓝线,结果是二维数组(4,2):
ndarray对象的属性:
.ndim:秩,即轴的数量或维度的数量
.shape:ndarray对象的尺度,对于矩阵, n行m列
.size :ndarray对象元素的个数,相当于.shape中n*m的值
.dtype :ndarray对象的元素类型
.itemsize: ndarray对象中每个元素的大小,以字节为单位
p = [[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]],[[12,13,14],[15,16,17]],[[18,19,20],[21,22,23]],]
nump = np.array(p)
print(nump)
print(nump.sum())
print(nump.sum(axis=0))
print(nump.sum(axis=1))
print(nump.sum(axis=2))
print("ndim: ",nump.ndim)
print("shape: ",nump.shape)
print("size : ",nump.size)
print("dtype: ",nump.dtype)
print("itemsize: ",nump.itemsize)
运行的结果:
ndarray数组的创建:
• 从Python中的列表、元组等类型创建ndarray数组
• 使用NumPy中函数创建ndarray数组,如: arange, ones, zeros等
从Python中的列表、元组等创建:np.array([1,2,3],dtype=np.float32)
当np.array()不指定dtype时, NumPy将根据数据情况关联一个dtype类型
使用NumPy中函数创建ndarray数组:主要函数有
arange(n)、ones(shape)、zeros(shape)、full(shape,val)、eye(n)
array(n),产生从0开始,步长为1,到n-1的一维数组,array(start,stop,step)定制产生一维数组。
ones_like(a)、zeros_like(a)、full_like(a,val)
linespace()、concatenate()
ndarray数组的变换:
对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换
ndarray数组的维度变换:
ndarray数组的类型变换:
new_a = a.astype(new_type)
astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致
ndarray数组向列表的转换:
ls = a.tolist()
ndarray数组的操作:
数组的索引和切片,与python中列表的操作类同。
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
ndarray数组的运算:
数组与标量之间的运算:
数组与标量之间的运算作用于数组的每一个元素。
NumPy一元函数:对ndarray中的数据执行元素级运算的函数
NumPy二元函数: