数据分析三剑客
数据分析三剑客(numpy,pandas,matplotlib)
一、numpy
1、numpy数组的属性
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即州的数量或者维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n行m列 |
ndarray.size | 数组元素的总个数,相当于.shape中的n*m值,一维可以使用len,多维不可使用len |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
a = np.array([i for i in range(10)])
print('展示数组a',a,'展示数组a的维度',a.ndim,'展示数组a的总个数',a.size,'展示数组a的类型',a.dtype)
# 展示数组a [0 1 2 3 4 5 6 7 8 9] 展示数组a的维度 1 展示数组a的总个数 10 展示数组a的类型 int32
2、修改数组的属性
reshape和resize
1、reshape会返回调整维度的新数组,不会影响原数组,但修改后的的数组个数要跟原数组个数一致。
a = np.array([i for i in range(9)])
b=a.reshape((3,3))
print('a的数据是',a,'b的数据是',b)
#输出的结果是:
#a的数据是 [0 1 2 3 4 5 6 7 8]
#b的数据是 [[0 1 2]
# [3 4 5]
# [6 7 8]]
# 若改为(2,3)则会报错
c=a.reshape((2,3))
# 输出:ValueError: cannot reshape array of size 9 into shape (2,3)
2、resize可以对原数组的数据进行重新修改,在原数组的基础上进行修改,不要求修改的数据与原数组的数据保持一致。
# 原数组只有10个数,却重新生成12个数,会在后面的数据中补0
a = np.array([i for i in range(9)])
print(a)
a.resize((2,6))
print('a的数据是',a)
# 输出:
# [0 1 2 3 4 5 6 7 8]
# a的数据是 [[0 1 2 3 4 5]
# [6 7 8 0 0 0]]
# 当数据不够的时候,会在后面循环补入数据
a = np.array([i for i in range(9)])
print(a)
b=np.resize(a,(3,3))
print('b的数据是',b)
# 输出:
# b的数据是 [[0 1 2]
# [3 4 5]
# [6 7 8]]
astype
astype,可以修改数组中数据的类型,int改为float或者string等
a = np.array([i for i in range(9)])
b=a.astype('float32').dtype
print('数据b',b,'数据b的类型',b.dtype)
# 输出:数据b [0. 1. 2. 3. 4. 5. 6. 7. 8.] 数据b的类型 float32
3、创建数组array
numpy.array(object,dtype=None,copy=True,order=None,subook=False,ndmin=0)
参数
序号 | 参数 | 描述说明 |
---|---|---|
1 | object | 表示一个数组序列 |
2 | dtype | 可选参数,通过它可以更改数组的数据类型 |
3 | copy | 可选参数,当数据源是ndarry时表示数组能否被复制,默认时True |
4 | order | 可选参数,以那种内存布局创建数组,有3仡可选项,分别是C(行序列),F(列序列),A(默认) |
5 | ndmin | 可选参数,用于指定数组的维度 |
6 | subok | 可选参数,类型时bool值,默认为False。为True,使用object的内部数据类型;Flase,使用object数组的数据类型 |
# 1、object的类型:array 中的object可以放数组,生成器,迭代对象,列表
import numpy as np
# 数据是生成器
a = np.array([i for i in range(10)])
print(a) # 输出:[0 1 2 3 4 5 6 7 8 9]
# 数据是列表
b = np.array([1, 2, 3, 5, 6])
print(b) #输出:[1 2 3 5 6]
# 当数据中的数据类型不一致的时候,会自动向数据类型最大的进行转换
c = np.array([1, 1.2, 3, 3.4])
print(c, type(c),c.dtype) # 输出:[1. 1.2 3. 3.4] <class 'numpy.ndarray'> float64
# 2、dtype的类型:int16,int32,int64,float32,float64,float 128,string,对数组中的数据进行强制类型转换
# 当数据中的数据类型不一致的时候,会自动向数据类型最大的进行转换
c = np.array([1, 1.2, 3, 3.4],dtype=int)
print(c, type(c),c.dtype) #输出:[1 1 3 3] <class 'numpy.ndarray'> int32
# 3、copy的使用,默认是True,即跟原数组id不同,创建一个新的数据,在对新数组操作时,并不是影响原来的数组
a = np.array([i for i in range(10)])
d=np.array(a)
print('数组a的数据',a,'数组d的数据',d)
print('数组a的地址',id(a),'数组b的地址',id(d))
# 输出: 数组a的数据 [0 1 2 3 4 5 6 7 8 9] 数组d的数据 [0 1 2 3 4 5 6 7 8 9]
# 数组a的地址 2262539031536 数组b的地址 2262535997552
# 将copy改为False,两个数组的id即为一样
a = np.array([i for i in range(10)])
d=np.array(a,copy=False)
print('数组a的数据',a,'数组d的数据',d)
print('数组a的地址',id(a),'数组b的地址',id(d))
#输出: 数组a的数据 [0 1 2 3 4 5 6 7 8 9] 数组d的数据 [0 1 2 3 4 5 6 7 8 9]
# 数组a的地址 2613998769136 数组b的地址 2613998769136
# 4、ndmin指定数组的维度
a = np.array([i for i in range(10)],ndmin=2)
print(a) #输出 [[0 1 2 3 4 5 6 7 8 9]] 变成二维数组
4、创建连续数组arrange
numpy.arrange(start,stop,step,dtype)
参数说明
参数 | 描述说明 |
---|---|
start | 起始值,默认是0 |
stop | 终止值,不包含 |
step | 步长,默认为1 |
dtype | 返回ndarray的数据类型,如果没有提供,则会使用输入数据的数据类型 |
# 使用numpy自带的函数生成连续的数组
a=np.arange(1,10)
print(a) # 输出的结果:[1 2 3 4 5 6 7 8 9]
# 通过生成一个连续列表生成一个数组
b=np.array([i for i in range(1,10)])
print(b) # 输出的结果:[1 2 3 4 5 6 7 8 9]
5、数组的切片和索引
数组的切片和列表的切片类似,都是通过变量【索引值】
# 切片和索引
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是:')
print(x)
# 输出:
# 我们的数组是:
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
rows = np.array([[0, 0], [3, 3]])
cols = np.array([[0, 2], [0, 2]])
y = x[rows, cols]
print('这个数组的四个角元素是:',y)
# 输出:
# 这个数组的四个角元素是:
# [[ 0 2]
# [ 9 11]]
# 若取得数为连续就使用冒号或者逗号,若取到数为不连续则将点的坐标以上述表示
x = np.random.randint(1, 200, 20).reshape(4, 5)
print("随机取20个数:", x)
# 输出
#随机取20个数: [[185 67 29 81 167]
# [ 62 47 133 124 2]
# [ 69 91 124 136 80]
# [132 62 3 183 85]]
# 获取前三行的数据和第三列和第五列的数据交际
print("连续索引", x[0:3, [2, 4]])
# 输出:
#连续索引 [[ 29 167]
# [133 2]
# [124 80]]
# 花式索引(np._ix索引np.ix_(i,j,k,o),(x,y,z,w)排列有16种可能,取16个数)
x = np.arange(32).reshape((8, 4))
print("花式索引:", x[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])])
# 输出:
# 花式索引: [[ 4 7 5 6]
# [20 23 21 22]
# [28 31 29 30]
# [ 8 11 9 10]]
6、广播机制
当对两个 array 进行操作时,numpy 会逐元素比较它们的形状。从尾(即最右边)维度开始,然后向左逐渐比较。只有当两个维度 1)相等 or 2)其中一个维度是1 时,这两个维度才会被认为是兼容。
如果不满足这些条件,则会抛出 ValueError:operands could not be broadcast together 异常,表明 array 的形状不兼容。最终结果 array 的每个维度尽可能不为 1 ,是两个操作数各个维度中较大的值 。
import numpy as np
b = np.random.randint(1,12,6).reshape((2,3))
print(b.shape,b)
# 输出:数组b的数据
# (2, 3) [[10 5 8]
# [ 7 10 5]]
c = np.array([1,2,3])
print(c.shape,c)
# 输出c数组
# (3,) [1 2 3]
print(b*c)
# 输出乘积
# [[10 10 24]
# [ 7 20 15]]
7、numpy的数据统计
平均数 mean
默认值,不加任何参数,则表示求所有数据的平均数;若axis=1,则表示求每一列的平均数,从上往下计算;若axis=0,则求每一行的平均数,从左往右计算,生成一维数组。
import numpy as np
a=np.arange(12).reshape((3,4))
print(a)
print('求解数组a的平均数',a.mean(),'\t求解数组a每一行的平均数',a.mean(axis=1),'\t求解数组a每一列的平均数',a.mean(axis=0))
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# 求解数组a的平均数 5.5 求解数组a每一行的平均数 [1.5 5.5 9.5] 求解数组a每一列的平均数 [4. 5. 6. 7.]
中位数 median
中位数,又称中点数,中值;是指按顺序排序的一组数据中居于中间位置的数据,代表一个样本,种群或概率分布的一个数值;
平均数和中位数的区别:
-
平均数:是一个“虚拟”的数,是通过计算得到的,他不是原始数据。中位数:是一个不完全“虚拟”的数。
-
平均数:反映了一组数据的平均大小,常用来代表数据的“平均水平”。中位数:像是一条分界线,将数据分成前半段和后半段
import numpy as np a=np.random.randint(1,100,12).reshape((3,4)) print(a) print(np.median(a)) # 输出 #[[40 54 10 25] # [ 4 54 82 59] # [66 95 7 83]] # 54.0
标准差 std 和方差var
标准差std
在概率统计中最常用作为统计分布程度上的测量,是反映一组数据离散程度中最常见的一种量化形式
-
标准差定义是总体各单位标准值与其平均数离散平方的算数平均数的平方根
-
一个较大的标准差,代表大部分数值和其平均值之间差异较大
-
一个较小的标准差,代表这些数值比较接近平均值
方差var
衡量随机变量或一组数据时离散程度的度量
import numpy as np
a=np.arange(1,13).reshape((3,4))
print(a)
print('标准差\t',np.std(a),'方差\t',np.var(a))
# 输出
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
# 标准差 3.452052529534663 方差 11.916666666666666
最大值 max 最小值 min 求和sum
默认值,不加任何参数,则表示求所有数据的平均数;若axis=1,则表示求每一列的平均数,从上往下计算;若axis=0,则求每一行的平均数,从左往右计算,生成一维数组。
import numpy as np
a=np.arange(1,13).reshape((3,4))
print(a)
print('求和',np.sum(a))
print('整个数组的最大值',np.max(a),'整个数组的最小值',np.min(a))
print('每一行的最大值',np.max(a,axis=1),'每一行的最小值',np.min(a,axis=1))
print('每一列的最大值',np.max(a,axis=0),'每一列的最小值',np.min(a,axis=0))
# 输出
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
# 求和 78
# 整个数组的最大值 12 整个数组的最小值 1
# 每一行的最大值 [ 4 8 12] 每一行的最小值 [1 5 9]
# 每一列的最大值 [ 9 10 11 12] 每一列的最小值 [1 2 3 4]
8、文件操作
9、随机函数
Numpy中也有自己的随机函数,其中包含random模块中。它可以产生特定分布的随机数,如正态分布等。
函数名 | 功能 | 参数使用(int a, b, c, d) |
---|---|---|
rand(int,[int2,[int3,]]) | 生成(0,1)均匀分布随机数 | (a),(a,b),(a,b,c) |
randn(int1,[int2,[int3,]]) | 生成标准正态分布随机数 | (a),(a,b),(a,b,c) |
randint(low[,height,size,dtype]) | 生成随机整数 | (a,b),(a,b,c),(a,b,(c,d)) |
sample(size) | 生成[0,1)随机数 | (a),((a,b)),((a,b,c)) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构