列表与数组的区别:列表中的数据数据类型可以不一样,数组的各个数据类型一样。
数据的维度
一维数据:由对等关系的有序或无需数据构成,线性组织方式。
二维数据:由多个一维数据构成,是一维数据的组合形式。如表格。
多维数据:多维数据由一维或二维数据在新维度上扩展而成。
高维数据:仅利用基本的二元关系展示数据间的复杂结构。键值对
一 numpy
1.1 ndarray基本概念及属性
N维数组对象ndarray,包含实际的数据、描述这些数据的元数据(数据维度、类型等)。ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。若是非同质的元素,则全为object对象类型。更关注数据结构表达
轴(axis):保存数据的维度
秩(rank):轴的数量,即有多少个维度nidm
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
print ("秩:", a.ndim) # 秩
print("shape:" , a.shape ) # ndarray 对象的尺度,n行m列 shape: (2, 2)
print("size:" , a.size) # ndarray对象元素的个数,相当于n*m size: 4
print(a.dtype) # ndarray对象元素类型 int64
print(a.itemsize) # ndarray对象每个元素的大小,以byte为单位 8
ndarray数据类型:
数据类型 | 说明 | 数据类型 | 说明 |
---|---|---|---|
bool | 布尔类型,取值True False | uint8 | 8位无符号整数,[0, 255] |
intc | 与c语言int一致,一般是int32或int64 | uint16 | 16位无符号整数,[0, 65535] |
intp | 用于索引的整数,与c语言中ssize_t一致,一般是int32或int64 | uint32 | 32位无符号整数 |
int8 | 8位长度的整数,[-128,127] | uint64 | 64位无符号整数 |
int16 | 16位长度整数 | float16 | 16位单精度浮点数,1位符号位,5位指数,10位尾数 |
int32 | 32位长度整数 | float32 | 32位单精度浮点数,1位符号位,8位指数,23位尾数 |
int64 | 64位长度整数 | float64 | 64位单精度浮点数,1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 | complex128 | 复数类型,实部和虚部都是64位浮点数 |
1.2 ndarray的创建
从列表、元祖等类型创建ndarray数组
x = np.array(list/tuple)
如:np.array([1,2,3,4])、np.array((1,2,3,4))、np.array([[1,2],(3,4)])
使用numpy中的函数创建 arange、ones、zeros等
函数 | 说明 |
---|---|
np.arange(n) | 类似python的range函数,返回元素为 0~n-1 的ndarray函数,默认类型整数 |
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() | 将两个或多个数组合并生成一个新的数组 |
b = np.linspace(1,10,4) # [ 1. 4. 7. 10.]
c = np.linspace(1,10,4, endpoint=False) # [1. 3.25 5.5 7.75] endpoint表示10是否为生成元素中的一个,其实就是多生成一份,把最后一份砍掉 [1. 3.25 5.5 7.75 10.]
np.concatenate( [b,c] ) # [ 1. 4. 7. 10. 1. 3.25 5.5 7.75]
从字节流中创建
1.3 ndarray的变换
函数 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与reshape功能一致,但修改原数组 |
.swapaxes(ax1, ax2) | 将数组n个维度中两个维度进行调换,如2x3的数组变为3x2的数组 |
.flatten() | 对数组进行降维,返回一个折叠后的一维数组,原数组不变 |
.tolist() | 转为列表 |
.astype(new_type) | 改变元素类型,返回一个新数组,原数组不变 |
a = np.array( (2,3,4), dtype=np.int32 )
np.swapaxes( 0, 2)
a.astype(np.float32) # [2. 3. 4.]
1.4 ndarray的操作——切片和索引
a = np.array([1,2,3,4,5]) # 一维数组
print(a[1:4:2]) # [2 4] 切片————起始编号:终止编号(不含):步长(每走2步取一个)
a = np.arange(24).reshape(2,3,4) # 多维数组
print(a)
'''[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]] '''
print(a[1,2,3]) # 23 第一个维度的第一个,第二个维度的第二个,第三个维度的第三个
print(a[-1,-2,-3]) # 17
# 切片:
print( a[:, 1, -3] ) # [5,17] 不考虑第一个维度,即第一个维度的所有元素,考虑第二个取第1个,第三个维度取倒数第三个
print(:, 1:3, : ) # 不考虑第1和第3个维度。第二个维度取第1 2 号元素
'''[[[ 4 5 6 7]
[ 8 9 10 11]]
[[16 17 18 19]
[20 21 22 23]]]'''
1.5 ndarray的计算
a = np.arange(24).reshape(2,3,4)
print(a.mean()) # 所有元素的算术平均值,即(0 + 1 + 2 +...+23)/24
一元函数 | 说明 |
---|---|
np.abs(x) np.fabs(x) | 计算数组x各元素的绝对值 |
np.sqrt(x) | 计算数组x各元素的平方根 |
np.square(x) | 计算数组x各元素的平方 |
np.log(x) np.log10(x) np.log2(x) | 计算数组x各元素的e底对数、10底对数、2底对数 |
np.ceil(x) np.floor(x) | 计算数组x各元素的向上取整、向下取整 |
np.rint(x) | 计算数组x各元素的四舍五入值 |
np.modf(x) | 将数组各元素的小数和整数部分以两个独立数组形式返回 |
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) | 计算数组x各元素的普通型和双曲型的三角函数 |
np.exp(x) | 将数组各元素以e为底的指数值 |
np.sign(x) | 将数组各元素的符号值, 1(+),0,-1(-) |
二元函数 | 说明 |
---|---|
+ - * / | 两个数组各元素进行对应运算 |
np.maximum(x, y) np.fmax() np.minimum(x, y) np.fmin() | 元素级的最大、最小值运算 |
np.mod(x, y) | 元素级的模运算 |
np.copysign(x, y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
> = < != == | 算术比较,产生布尔型数组 |
1.6 ndarray数组从文件存取
- 固定格式的数据存取
np.savetxt(fname, array, fmt=‘%.18e’, delimiter=’ '):
fname: 文件名称 ,如a.txt、 b.csv,可以是.gz .bz2的压缩文件
array:存入文件的数组
fmt:写入文件的格式,如:%d %.2f %.18e
delimiter:分割字符串,默认为任何空格
np.loadtxt(fname, dtype=np.float, delimiter=None, unpack=False):
fname:文件名称,可以是.gz .bz2的压缩文件
dtype:数据类型
delimiter:分割字符串,默认为任何空格
unpack:如果为True,读入属性将被拆分,分别写入不同变量
- numpy便捷存取
np.save(fname,array) 或 np.savez(fname, array):默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
fname:文件名,以.npy为扩展名,压缩扩展名为.npz
array:数组变量
np.load(fname)
fname:文件名
- 对于多维数据的存取如下,将数据降维一维存入到文件中,因此在读的时候需要提前知道数据的维度以及格式。
x.tofile(fname, sep=‘’, format=‘%s’)
fname:文件名称
sep:数据分割字符串,如果是空串,即不指定,写入文件为二进制格式
format:写入数据的格式
np.fromfile(file, dtype=None, count=-1, sep=‘’)
file: 文件名称
dtype:读取的数据类型,默认float
count:读入元素个数,-1表示读入整个文件
sep:数据分割字符串,如果是空串,即不指定,读入文件为二进制格式
1.7 numpy随机数函数(numpy.random包中)
函数 | 说明 |
---|---|
np.random.rand(d0,d1,…,dn) | 根据d0-dn创建shape为(d0,d1,d2,…)的随机数数组,浮点数,[0,1),均匀分布 |
randn(d0,d1,…,dn) | 根据d0-dn创建shape为(d0,d1,d2,…)的随机数数组,标准正态分布 |
randint(low,high,size) | 根据size创建随机整数数组,范围为[low,high) |
seed(s) | 指定随机数生成时所用算法开始的整数值,s是给定的种子值,如果使用相同的种子,则每次生成的随即数都相同 |
choice(a, size, replace, p) | 从一维数组a中以概率p抽取元素,形成size形状的新数组,replace表示是否可以重用已抽取的元素,默认为True |
uniform(low,high,size) | 产生具有均匀分布的数组,low为起始值,high为结束值,size形状 |
normal(loc,scale,size) | 产生具有正态分布的数组,loc为均值,scale为标准差,size形状 |
poisson(lam,size) | 产生具有泊松分布的数组,lam随机事件发生概率,size形状 |
shuffle(a) | 根据数组a的第1轴进行随机排列(整体移动),改变数组a |
permutation(a) | 根据数组a的第1轴产生一个新的乱序数组(整体移动),不改变数组a |
1.8 numpy统计函数
函数 | 说明 |
---|---|
np.sum(a, axis=None) | 根据给定轴asix计算数组a相关元素的之和,axis整数或元组 |
np.mean(a, axis=None) | 根据给定轴asix计算数组a相关元素的期望,axis整数或元组 |
np.average(a, axis=None, weights=None) | 根据给定轴asix计算数组a相关元素的加权平均值,axis整数或元组 |
np.std(a, axis=None) | 根据给定轴asix计算数组a相关元素的标准差 |
np.var(a, axis=None) | 根据给定轴asix计算数组a相关元素的方差 |
np.min(a) np.max(a) | 计算数组a中的最大、最小值 |
np.argmin(a) np.argmax(a) | 计算数组a中的最大、最小值的降一维后下标 |
np.unravel_index(index, shape) | 根据shape将一维下标index转换成多维下标 |
np.ptp(a) | 计算数组a中的最大与最小值的差 |
np.median(a) | 计算数组a中元素的中位数 |
1.9 numpy梯度函数
np.gradient(f): 计算数组f中元素的梯度(连续值之间的变化率,即斜率),当f为多维时,返回每个维度梯度;
如,XY坐标轴连续三个X坐标对应的Y轴值:a,b,c,其中b的梯度为:(c-a)/2
- 一维:
- 多维:
二 pandas
基于numpy实现,提供高性能易用数据类型和分析工具,两个重要数据类型:series、DataFrame。更关注数据应用表达。
2.1 Series类型(一维数据类型)
由一组数据及与之相关的数据索引组成,可由列表、标量、字典、ndarray创建等 ,对Series的操作类似ndarray类型的操作。
import pandas as pd
pd.Series(data, index, dtype, name, copy)
# data:一组数据(ndarray 类型)。
# index:数据索引标签,如果不指定,默认从 0 开始。
# dtype:数据类型,默认会自己判断。
# name:设置名称。
# copy:拷贝数据,默认为 False。
2.2 DataFrame类型(二维数据类型)
- axis = 1,1轴向右水平延伸,按行计算 ;axis = 0,0 轴垂直往下,按列计算
- NaN与任何数据计算都为NaN
2.2.1 DataFrame索引
DataFrame类型索引分为行索引和列索引,由一个行索引+一个列索引可以确定唯一一个数据。行标签(index),列标签(column)。
- loc:根据行标签索引
- iloc:integer loc,用整数索引
- ix:loc和iloc的综合版本,既可以按标签选取,又可以按位置选取
import pandas as pd
a = pd.DataFrame(data = {
"height": [180, 175, 190],
"weight": [140, 120, 170]
})
'''
height weight
0 180 140
1 175 120
2 190 170
0 180
1 175
2 190
'''
print(a)
print(a["height"]) # 取某一列
print(a.loc[0]) # 取某一行
print(a["height"][0]) # 取某一格 180
print(a.loc[0]["height"]) # 取某一格 180
2.3 Pandas数据类型操作
函数 | 说明 |
---|---|
.reindex() | 能够改变或者重排Series或DataFrame索引 |
.drop() | 删除某一行或某一列的数据,不改变原有df,生成新对象 |
import pandas as pd
a = pd.DataFrame(data = {
"height": [180, 175, 190],
"weight": [140, 120, 170]
})
'''
height weight
0 180 140
1 175 120
2 190 170
0 180
1 175
2 190
'''
# ---------drop--------------:
a.drop([0,1]) # 删除第0、1行
a.drop(["height"], axis=1) # 删除height列,删除列时要加axis=1
# ---------reindex-----------:
a = a.reindex(columns=["weight", "height"], index=[1, 2, 0])
# index, columns:新的行、列自定义索引
# fill_value:重新索引中,用于填充数据缺失位置的值
# method:填充方法,ffill当前值向前填充,bfill当前值向后填充
# limit:最大填充量
# copy:默认True,更换索引后生成新的对象,False时,新旧相等不复制
'''
weight height
1 120 175
2 170 190
0 140 180
'''
Series和DataFrame的索引是Index类型,Index对象是不可以修改类型
索引类型的常用函数(df.index.xxx / df.columns.xxx) | 说明 |
---|---|
.append(idx) | 连接另一个index对象,产生新的index对象 |
.diff(idx) | 计算差集,产生新的index对象 |
.intersection(idx) | 计算交集 |
.union(idx) | 计算并集 |
.delete(loc) | 删除loc位置的元素 |
.insert(loc, e) | 在loc位置增加一个元素e |
2.4 Pandas数据类型运算
- 算术运算:根据行、列索引,补齐后运算,运算默认产生浮点数。补齐时填充NaN(NaN与任何运算都是NaN),二维和一维(默认二维的每一行与一维进行运算,函数中指定axis=0二维的每一列与一维进行运算)、一维和零维间为广播运算。采用±*/进行的二元运算产生新的对象。
import numpy as np
import pandas as pd
a = pd.DataFrame(np.arange(12).reshape(3,4))
b = pd.DataFrame(np.arange(20).reshape(4,5))
print(a+b)
'''
0 1 2 3 4
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
'''
函数 | 说明 |
---|---|
.add(d, **argws) | 类型间加法运算,可选参数 |
.sub(d, **argws) | 类型间减法运算,可选参数 |
.mul(d, **argws) | 类型间乘法运算,可选参数 |
.div(d, **argws) | 类型间除法运算,可选参数 |
import numpy as np
import pandas as pd
a = pd.DataFrame(np.arange(12).reshape(3,4))
b = pd.DataFrame(np.arange(20).reshape(4,5))
print(a.add(b, fill_value = 0)) # 可以选择fill_value去替代NaN
'''
0 1 2 3 4
0 0.0 2.0 4.0 6.0 4.0
1 9.0 11.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0
'''
- 比较运算:>、 <、 == 同维度运算,尺寸一致才可以,否则会报错;不同维度,广播运算,与上述广播机制一致。
2.5 Pandas数据排序
函数 | 说明 |
---|---|
.sort_index() | 在指定轴上根据索引进行排序,默认axis=0,升序 |
.sort_values() | 在指定轴上根据数值进行排序,默认axis=0,升序 |
import numpy as np
import pandas as pd
a = pd.DataFrame(np.arange(12).reshape(3,4))
a.sort_index(axis= 1, ascending=True) # 对a的列索引(columns)进行升序排序
Series.sort_values(axis=0,ascending=True)
DataFrame.sort_values(by, axis=0,ascending=True) # by:axis轴上的某个索引或索引列表
2.6 Pandas基本统计分析函数
函数 | 说明 |
---|---|
df.sum() | 计算数据的总和,默认按0轴计算,即每一行之和,下同 |
df.count() | 非NaN值的数量 |
df.mean() .median() | 计算数据的算数平均值、算术中位数 |
df.var() df.std() | 计算数据的方差、标准差 |
df.min() df.max() | 计算数据的最小值、最大值 |
df.describe() | 针对0轴(每一列)的统计汇总 |
只适用于Series:
函数 | 说明 |
---|---|
.argmin() .argmax() | 计算数据最大值、最小值所在位置的索引位置(自动索引) |
.idxmin() .idxmax() | 计算数据最大值、最小值所在位置的索引位置(自定义索引) |
2.7 Pandas累计统计分析函数
函数 | 说明 |
---|---|
.cumsum() | 依次给出前1、2、…、n个数的和 |
.cumprod() | 依次给出前1、2、…、n个数的积 |
.cummax() | 依次给出前1、2、…、n个数的最大值 |
.cummin() | 依次给出前1、2、…、n个数的最小值 |
窗口计算函数 | 说明 |
---|---|
.rolling(w).sum() | 依次计算相邻(从该元素往上)w个元素的和,默认0轴,下同 |
.rolling(w).mean() | 依次计算相邻w个元素的算术平均值 |
.rolling(w).var() | 依次计算相邻w个元素的方差 |
.rolling(w).std() | 依次计算相邻w个元素的标准差 |
.rolling(w).min().max() | 依次计算相邻w个元素的最小值和最大值 |
2.8 数据相关分析
协方差:
函数 | 说明 |
---|---|
.cov() | 计算协方差矩阵 |
series1.corr( series2, method ) | 计算相关系数矩阵,Pearson、Spearman、Kendall等系数,method可选Pearson等 |
三 matplotlib(暂无内容)
暂无内容