数据维度
维度:一组数据的组织形式
一维数据:由对等关系的有序或无序数据构成,采用线性组织形式。包括列表、集合和数组(python中不常见,但在C++和Java中比较常见)类型。
- 列表:数据类型可以不同
- 数组:数据类型相同
二维数据:由多个一维数据组成,是一维数据的组合形式(表现形式:列表)。 - 表格
多维数据:由一维或者二维数据在新维度上扩展形成(表现形式:列表)。
高维数据:利用最基本的二元关系展示数据间的复杂结构。
NumPy是一个开源的Python科学计算基础库。
- 一个强大的N维数组对象ndarray。
- 广播功能函数(是指ndarry在执行某些计算时,如矩阵间的数值计算,对应位置元素1对1执行标量运算,而非线性代数中的矩阵间的运算。可以确保数组间形状不完全相同时可以自动的通过广播机制扩散到相同的形状,进而执行相应的计算功能)。
- 整合C/C++/Fortran代码的工具。
- 线性代数、傅里叶变换、随机数生成等功能。
- NumPy是SciPy、Pandas等数据处理或科学计算库的 基础单元。
- NumPy的印用(import numpy as np)
使用Numpy进行科学计算,底层使用的C语言。
N维数组对象:ndarray。 - 观察:科学计算中,一个维度的所有数据类型往往相同,数组对象采用相同的数据类型,有助于节省运算空间。
ndarray是一个多维数组对象,由两部分构成: - 实际的数据。
- 描述这些数据的元数据(数据维度、数据类习性等)。
- nadarray数组一般要求所有元素类型相同(同质),数组下标从0开始(与列表相同)。
- 使用np.array()生成一个ndarray数组。
- ndarray在程序中的别名是:array.
- np。array(0输出成[]形式,元素间用空格分隔。
- ndarray的两个基本概念:是轴(axis):保存数据的维度;秩(rank):轴的数量,是描述ndarray的基本数据和形式。
ndarray对象的属性
属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | ndarray对象的尺度,对于矩阵,n行m列 |
.size | ndarray对象元素的个数,相当于.shape中的n*m值 |
.dtype | ndarray对象的元素类型 |
.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
a=np.array([[0,1,2,3,4],[9,8,7,6,5]])
a.ndim
a.dtype
a.itemsize
ndarray的元素类型
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
intc | 与C语言中的int 类型一致,一那是int32或者int64 |
intp | 用于索引的证书,与C语言中的ssize_t一致,int32或者int64 |
int8 | 字节长度的整数,取值:[-128,127] |
int16 | 16维长度的整数,取值:[-64,63] |
int32 | 32位长度的整数,取值:[-231 ,231 -1] |
int64 | 64位长度的整数,取值:[-263 ,263 -1] |
uint8 | 8位无符号整数,取值:[0,255] |
uint16 | 16位无符号整数,取值:[0,65535] |
uint32 | 32位无符号整数,取值[0,232 -1] |
uint64 | 64位无符号整数,取值:[0,264 -1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,6位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
numpy为什么有如此多的元素性能和类型?
ndarray的元素类型
- 对比:Python语法仅支持整数、浮点数和复数3种类型。
- 科学计算涉及的数据较多,对存储和性能都有较高的要求 ;
- 对元素类型精细定义,有助于Numpy合理使用存储空间并优化性能。
- 对元素类型精细定义,有助于程序员对程序规模有合理的评估。
ndarray数组的创建方法 - 从Python中的列表、元组等类型创建ndarray数组。
- 使用NumPy中函数创建ndarray数组,如:arange,ones,zeros等。
- 从字节流(raw bytes)中创建ndarray数组。
- 从文件中读取特定格式,创建ndarray数组。
ndarray数组的创建方法:
(1)从Python中的列表、元组等类型创建ndarray数组。
x=np.array(list/tuple)
x=np.array(list/tuple,dtype=np.float32)
x=np.array([0,1,2,3])##从列表类型创建
x=np.array((4,5,6,7))##从元组类型创建
x=np.array([[1,2],[9,8],(0.1,0.2)])##从列表和元组混合类型创建
当np.array()不指定dtype时,NumPy将根据数据情况指定一个dtype类型。
(2)使用Numpy中的函数创建ndarray数组,如:arange,ones,zeros等。
函数 | 说明 |
---|---|
np.arange(n) | 类似range()函数,返回ndarray类型,元素从0到n-1 |
np.ones(shape) | 根据shape生成一个全1数组,shape是元组类型 |
np.zeros(shape) | 根据shape生成一个全0数组,shape是元组类型 |
np.full(shape,val) | 根据shape生成一个数组,每个元素的值都是val |
np.eye(n) | 创建一个正方的n*n单位矩阵,对角线为1,其余为0 |
np.ones_like(a) | 根据数组a的形状生成一个全1数组 |
np.zeros_like(a) | 根据数组a的形状生成一个全0数组 |
np.full_like(a,val) | 根据数组a的形状生成一个数组,每个元素值都是val |
np.linspace() | 根据起止数据等间距地跳虫数据,形成数组 |
np.concatenate() | 将2个或多个数组合并成一个新的数组 |
np.array(10) ##得到一个从0到9的数组
np.ones((3,6))##得到一个所有元素都是1的,3行6列的数组
np.zeros((3,6),dtype=np.int32)##得到一个所有元素都是32位浮点类型数据0的,3行6列的数组
np.eye(5)##对角线为1的5阶数组
x=np.ones((2,3,4))##含有最外层两个元素的数组,每个元素有3行(3维)4列
print(x)
x.shape()
a=linspace(1,10,4)##生成的是从1到10之间,以步长为4的等间距数组
b=linspace(1,10,4,endpoint=False)##endpoint表示:终点值10 是否作为结束值
c=np.concatenate((a,b))##采用concatenate将a和b两个数组连接起来
ndarray数组的变换
对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换。
a=np.ones((2,3,4),dtype=np.int32)
ndarray数组的维度变换
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与.reshape()功能一致,但修改原数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中的2个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数,但原数组不变 |
a=np.ones((2,3,4),dtype=np.int32)
a.reshape((3,8))##对数组a进行变形,形成一个3维,每个维度8个元素的数组,基本前提是不改变元素的总个数。
a.resize((3,8))##如果是使用resize()的时候,将会改变原来a的形状。
b=a.flatten()##是对a数组进行降维,将得到一个一位数组。
ndarray数组的类型变换
new_a=a.astype(new_type)
a=np.ones((2,3,4),dtype=np.int)
b=a.astype(np.float)
ndarray数组向列表的转换
ls=a.tolist()
a=np.full((2,3,4),25,dtype=np.int32)
b=a.tolist()##将数组a转换成列表b
数组的索引和切片
一维数组的索引和切片:与Python的列表类似
a=np.array([9,8,7,6,5])
a[2]##一维数组a的第三个元素
a[1:4:2]##一维数组的切片:起始编号:终止编号不含:2是步长,切片中的三个元素间采取冒号分隔
多维数组的索引和切片
索引
a=np.arange(24).reshape((2,3,4))
a
a[1,2,3] ##对多维数组进行索引,最外层第一个元素的第二维度的第三个元素
a[0,1,2] ##最外层第0个元素的第一维度的第二个元素(numpy的数据都是从0开始下标)
a[-1,-2,-3] ##采用负数进行索引,最后一层的倒数第二维度的倒数第三个元素
##注意,每个维度的索引值之间用逗号分隔
多维数组的切片
a=np.arange(24).reshape((2,3,4))
a[:,1,-3]##选取一个维度(切片不含第三个元素)
a[:,1:3,:]##每个维度切片,与一维数组相同
a[:,:,::2]##使用冒号,表示覆盖每个维度的全部数据,每个维度可以以步长为2进行跳跃切片
ndarray数据的运算
数组标量之间的运算:作用于数组的每一个元素
a=np.arange(24).reshape((2,3,4))
a.means()##求数组的平均值,是一个标量
a=a/a.means()##用数组的每一个元素除以数组的平均值,获得a与平均值的商。
Numpy的一元函数,对ndarray中的元素执行元素级运算的函数
函数 | 说明 |
---|---|
np.abs(x);np.fabs(x) | 计算数组各元素的绝对值 |
np.sqrt(x) | 计算数组各元素的平方根 |
np.square(x) | 计算数组个元素的平方 |
np.log(x);np.log10(x);np.log2(x) | 计算数组个元素的自然对数、10底对数和2底对数 |
np.ceil(x);np.floor(x) | 计算数组各元素的ceiling值或floor值 |
np.rint(x) | 计算数组各元素的四舍五入值 |
np.modf(x) | 将数组以各元素的小数和整数部分以2各独立数组形式返回 |
np.cos(x),np.cosh(x);np.sin(x),sinh(x);np.tan(x) | 计算数组各元素的普通型和双曲型三角函数 |
np.exp(x) | 计算数组各元素的指数 |
npsign(x) | 计算数组各元素的符号值,1(+),0,-1(-) |
a=np.arange(24).reshape((2,3,4))
np.square(a)##不改变原来a的元素值,如果需要计算后的新值,需要对计算后的值进行赋值。
a=np.sqrt(a)
np.modf(a)
NumPy二元函数
函数 | 说明 |
---|---|
+;-:*;/: ** | 两个宿主各元素进行对应运算 |
np.maximum(x,y);np.fmax();np.minimum(x,y);np.fmin() | 元素级的最大值最小值计算 |
np.mod(x,y) | 元素级的模运算 |
np.copysign(x,y) | 将数组y中的各元素值的符号复制给素组x对应元素 |
>;<;>=;<=;==;!= | 算术比较,产生布尔型数组 |
小结回顾:
NumPy库入门
- 数据的维度:一维、二维、多维、高维
- ndarray类型属性、创建和变换
- 数组的索引和切片
- 数组的运算:一元函数、二元函数
属性
.ndim
.shape
.size
.dtype
.itemsize
创建和变换
np.arange(n)
np.ones(shape)
np.zeros(shape)
np.full(shape,val)
np.eye(n)
np.ones_like(a)
np.zeros_like(a)
np.full_like(a,val)
.reshape(shape)
.resize(shape)
.swapaxes(ax1,ax2)
.flatten(1)