数据的维度:
一维数据:由对等关系的有序或者无序数据构成,采用线性方程组织。
列表和数组:一组数据的有序结构
区别:1.列表:数据类型可以不同 2.数组:数据类型相同
二维数据:由多个一维数据构成,是一维数据的组合形式。 表格是典型的二维数据,其中,表头是二维数据的一部分。
多维数据:由一维或者二维数据在新维度上扩展形成。(比如加上一个时间维度)
高维数据:高维数据仅利用最基本的二元关系展示数据间的复杂结构。
数据表示格式有三种:json、xml、yaml
numpy
numpy是一个开源的python科学计算基础库
-
一个强大的N维数组对象ndarray
-
广播功能函数
-
整合C/C++/Fortran代码的工具
-
线性代数、傅里叶变换、随机数生成等功能
numpy是scipy\pandas等数据处理或者科学计算库的基础
N维数组对象:ndarray
-
数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
-
设置专门的数组对象,经过优化,可以提升这类应用的运算速度
观察:科学计算中,一个维度所有数据的类型往往相同。
-
数据对象采用相同的数据类型,有助于节省运算和存储空间
ndarray是一个多维数组对象,有两部分构成:
-
实际的数据
-
描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。
np.array() #生成一个ndarray数组 array是在程序中ndarray的别名
1.1 创建数组的方法
import numpy as np a = np.array([1,2,3,4,5]) b = np.array(range(1,6)) c = np.arange(1,6) print(a) print(b) print(c) print(a.dtype) # int32或int64 print(type(a)) # <class 'numpy.ndarray'>
以上三种方法结果是一样的,注意一下输入结果是数组
array:将输入数据(可以是列表、元组、数组以及其它序列)转换为ndarray(Numpy数组),如不显示指明数据类型,将自动推断,默认复制所有输入数据。
arange:Python内建函数range的数组版,返回一个数组。
array的属性:
• shape:返回一个元组,表示 array的维度 [形状,几行几列] (2,3)两行三列,(2,2,3)两个两行三列
• ndim:返回一个数字,表示array的维度的数目
• size:返回一个数字,表示array中所有数据元素的数目
• dtype:返回array中元素的数据类型
ndarray为什么要支持这么多种元素类型?
1.1.2.ndarray数组创建函数创建方法
a = np.linspace(1,10,4) # 起始值 最终值 四个元素 生成浮点型 a > array([1.,4.,7.,10.]) b = np.linspace(1,10,4,endpoint=False) # endpoint=False代表10要不要包括 b > array([1.,3.25,5.5,7.]) c = np.((a,b)) # 将两个数组合并成一个新数组 # c > array([1.,4.,7.,10.,1.,3.25,5.5,7.75])
1.1.3 ones_like创建形状相同的数组
np.ones_like(a,dtype=float,order='C',subok=True)
返回:与a相同形状和数据类型的数组,并且数组中的值都为1
参数:
a:用a的形状和数据类型,来定义返回数组的属性
dtype : 数据类型,可选
order顺序 : {'C','F','A'或'K'},可选,覆盖结果的内存布局。
subok : bool,可选。True:使用a的内部数据类型,False:使用a数组的数据类型,默认为True
案例1:以下数组是x
array([[0, 1, 2], [3, 4, 5]]) >>> np.ones_like(x) array([[1, 1, 1], [1, 1, 1]])
案例2:以下数组是y
array([ 0., 1., 2.]) >>> np.ones_like(y) array([ 1., 1., 1.])
2.2.3 ndarray数组的创建和变换
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与.reshape()功能一样,但那改变原数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中两个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
ndarray数组类型变换
new_a = a.astype(new_type) astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一
ndarray数组向列表的转换
ls = a.tolist()
2.2.4 ndarray数组的操作
数组的索引和切片
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
一维数组的索引和切片:与python的列表类似
a = np.array([9,8,7,6,5]) a[2] >> 7 a[1:4:2] >> array([8,6]) # 起始编号:终止编号(不含):步长
多维数组的索引:
a = np.arange(24).reshape((2,3,4))
多维数组的切片:
a [:,:,::2] # 每个维度可以使用步长跳跃切片
2.2.5ndarray数组的运算
数组与标量之间的运算作用于数组的每一个元素
a = np.arrange(24).reshape((2,3,4)) a a.mean() a = a / a.mean() 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) | 计算数组各元素的小数和整数部分以两个独立数组形式返回 |
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) | 计算数组各元素的普通型和双曲型三角函数 |
np.exp(x) | 计算数组各元素的指数值 |
np.sign(x) | 计算数组各元素的符号值,1(+),0,-1(-) |
a = np.arange(24).reshape((2,3,4)) np.square(a) a = np.sqrt(a) 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对应元素 |
> < >= <= == != | 算术比较,产生布尔型数组 |
a = np.arange(24).reshape((2,3,4)) b = np.sqrt(a) a b np.maximum(a,b) a > b
2.3.1数据的CSV文件存取
csv(comma-Separated Value,逗号分隔值)
csv是一种常见的文件格式,用来存储批量数据
csv的局限性:csv只能有效存储一维和二维数组
np.savetxt() np.loadtxt()只能有效存储一维和二维数组
# 将数据写入csv文件 np.savetxt(frame,array,fmt='%.18e',delimiter=None) ''' frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件 array:存入文件的数组 fmt:写入文件的格式,例如:%d整数形式 %.2f浮点数的形式%.18e delimiter:分割字符串,默认是空格 '''
a = np.arange(100).reshape(5,20) np.savetxt('a.csv',a,fmt='%d',delimiter=',')
# 将csv文件的数据读入array数组类型中 np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False) ''' frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件 dtype:数组类型,可选 delimiter:分割字符串,默认是任何空格 unpack:如果True,读入属性将分别写入不同变量 '''
b = np.loadtxt('a.csv',delimiter=',') b b = np.loadtxt('a.csv',dtype=np.int,delimiter=',') b
2.3.2多维数组的存取
任意维度数据如何存取呢?
对于ndarray数组可以使用数组中的一个方法:
a.tofile(frame,sep='',format='%s') ''' frame:文件、字符串的名字 sep:数据分割字符串,如果是空串,写入文件为二进制 format:写入数据的格式 不包含任何的维度信息,只是将数组中的文件列出 '''
a = np.arange(100).reshape(5,10,2) a.tofile("b.dat",sep=',',format='%d')
# 如果不指定分隔符这个变量 a = np.arange(100).reshape(5,10,2) a.tofile("b.dat",format='%d')
如何从文本文件和二进制文件还原这些数据呢?
np.fromfile(frame,dtype=float,count=-1,sep='') ''' frame:文件、字符串 dtype:读取的数据类型 count:读入元素个数,-1表示读入整个文件 sep:数据分割字符串,如果是空串,写入文件为二进制 '''
a = np.arange(100).reshape(5,10,2) a.tofile("b.dat",sep=',',format='%d') c = np.fromfile("b.dat",dtype=np.int,sep=",") c c = np.fromfile("b.dat",dtype=np.int,sep=",").reshape(5,10,2) c
使用该方法需要读取时知道存入文件时数组的维度和元素类型(在写一个文件可以通过元数据文件来存储额外信息)
a.tofile()和np.fromfile()需要配合使用 针对大规模数据
Numpy的便捷文件存取(要以numpy格式)
np.save(fname,array) np.savez(fname,array) ''' frame:文件名,以.npy为扩展名,压缩扩展名为.npz array:数组变量 ''' np.load(fname) ''' frame:文件名,以.npy为扩展名,压缩扩展名为.npz 还原为数组与数组的相关维度 '''