数据分析三剑客
numpy
pandas(重点)
matplotlib
numpy模块
NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。侧重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。
重点
numpy数组的创建
numpy索引和切片
级联
变形
矩阵的乘法和转置
常见的聚合函数+统计
numpy的创建
使用np.array()创建
使用plt创建
使用np的routines函数创建
使用np.array()创建
#用array()创建一个一维数组
importnumpy as np
np.array([1,2,3,4,5]) #array([1, 2, 3, 4, 5])
#使用array()创建一个多维数组
np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
数组和列表的区别是什么?
数组中存储的数据元素类型必须是统一类型
优先级:
字符串 > 浮点型 > 整数
np.array([1.1,'哈哈',11]) #array(['1.1', '哈哈', '11'], dtype='
np.array([1,5,6.1,8]) #array([1. , 5. , 6.1, 8. ])
将外部的一张图片读取加载到numpy数组中,然后尝试改变数组元素的数值查看对原始图片的影响
importmatplotlib.pyplot as plt#imread可以返回一个numpy数组
img_arr = plt.imread('./1.jpg')#将返回的数组的数据进行图像的展示
plt.imshow(img_arr) #imshow也可以将一个二维数组进行图片展示规
plt.imshow(img_arr + 100)
zeros()、ones()、linespace()、arange()、random系列
#ones zeros()与ones()相似
np.ones(shape=(3,4)) #返回一个3行4列的np数组,元素都是1., zeros是0.
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])#linspace返回一维形式的等差数列 开始 ,结束,一共8个元素
np.linspace(0, 50, num=8)
array([ 0. ,7.14285714, 14.28571429, 21.42857143, 28.57142857,35.71428571, 42.85714286, 50. ])#arange返回一维形式的等差数列
np.arange(0,50,5)
array([ 0,5, 10, 15, 20, 25, 30, 35, 40, 45])#random.randint 返回指定形状的随机整数数组
np.random.randint(0,20,size=(4,5))
array([[3, 1, 16, 14, 1],
[18, 13, 10, 14, 18],
[19, 19, 1, 8, 13],
[15, 2, 17, 15, 6]])#random.random 随机范围0-1
np.random.random(size=(2, 2))
array([[0.16654448, 0.59399791],
[0.6076535 , 0.89254046]])
numpy的常用属性
shape 形状
ndim 维度
size 元素总个数
dtype 元素的数据类型
img_arr.shape #返回数组形状
(500, 500, 3)
img_arr.ndim#返回数组维度
3img_arr.size#返回数组元素总个数
750000img_arr.dtype#返回数组元素的数据类型
dtype('uint8')
type(img_arr)#返回数组的数据类型
numpy.ndarray
numpy的数据类型
array(dtype=?):可以设定数据类型
arr.dtype = '?':可以修改数据类型
arr.astype('?'):也可以修改数据类型
修改数据类型
arr = np.array([1,2,3], dtype='float16')
array([1., 2., 3.], dtype=float16)#1、修改arr元素的数据类型
arr.astype('int8')
array([1, 2, 3], dtype=int8)#2、修改arr元素的数据类型
arr.dtype='float16'array([1., 2., 3.], dtype=float16)
numpy的索引和切片操作(重点)
索引取值操作
索引取值操作和列表同理
arr = np.random.randint(0,100,size=(5,6))
array([[21, 36, 62, 40, 52, 54],
[91, 45, 40, 35, 17, 98],
[48, 49, 36, 59, 47, 36],
[80, 66, 77, 21, 1, 80],
[18, 32, 55, 0, 32, 12]])
arr[3][4]1arr[0,4]52
切片操作
切出前两行数据
切出前两列数据
切出前两行的前两列的数据
数组数据翻转
练习:将一张图片上下左右进行翻转操作
练习:将图片进行指定区域的裁剪
#切出数组的前两行的数据
arr[0:2]
array([[21, 36, 62, 40, 52, 54],
[91, 45, 40, 35, 17, 98]])#切出数组的前两列
arr[:,0:2]
array([[21, 36],
[91, 45],
[48, 49],
[80, 66],
[18, 32]])#切出数组前两行的前两列
arr[0:2, 0:2]
array([[21, 36],
[91, 45]])#将数组行倒置
arr[::-1]
array([[18, 32, 55, 0, 32, 12],
[80, 66, 77, 21, 1, 80],
[48, 49, 36, 59, 47, 36],
[91, 45, 40, 35, 17, 98],
[21, 36, 62, 40, 52, 54]])#将数组列倒置
arr[::,::-1]
array([[54, 52, 40, 62, 36, 21],
[98, 17, 35, 40, 45, 91],
[36, 47, 59, 36, 49, 48],
[80, 1, 21, 77, 66, 80],
[12, 32, 0, 55, 32, 18]])#将数组进行行列导倒置
arr[::-1,::-1]
array([[12, 32, 0, 55, 32, 18],
[80, 1, 21, 77, 66, 80],
[36, 47, 59, 36, 49, 48],
[98, 17, 35, 40, 45, 91],
[54, 52, 40, 62, 36, 21]])
将图片进行翻转
importmatplotlib.pyplot as plt
img_arr= plt.imread('./1.jpg')
plt.imshow(img_arr)
img_arr.shape
(500, 500, 3) #前俩个是图片像素,最后一个是颜色维度
#将图片左右翻转
plt.imshow(img_arr[:,::-1,:])#将图片上下翻转
plt.imshow(img_arr[::-1])#上下左右颜色都倒置
plt.imshow(img_arr[::-1,::-1,::-1])#图片的裁剪:将脸部数据裁剪下来
plt.imshow(img_arr[30:300,140:330,:])
变形 reshape
注意:变形前和变形后数组的容量不可以发生变化
arr.shape
(5, 6)#将二维数组变形成一维数组 reshape()
arr_1 = arr.reshape((30,)) #原数组一共有30个元素,所以这里必须是30
array([21, 36, 62, 40, 52, 54, 91, 45, 40, 35, 17, 98, 48, 49, 36, 59, 47,36, 80, 66, 77, 21, 1, 80, 18, 32, 55, 0, 32, 12])#将一维数组变多维
arr_1 = arr.reshape((3,10)) #给定一个值另一个可以用-1自动计算
array([[21, 36, 62, 40, 52, 54, 91, 45, 40, 35],
[17, 98, 48, 49, 36, 59, 47, 36, 80, 66],
[77, 21, 1, 80, 18, 32, 55, 0, 32, 12]])
arr_1= arr.reshape((-1,10))
arr_1= arr.reshape((3,-1))
array([[21, 36, 62, 40, 52, 54, 91, 45, 40, 35],
[17, 98, 48, 49, 36, 59, 47, 36, 80, 66],
[77, 21, 1, 80, 18, 32, 55, 0, 32, 12]])
级联操作 concatenate
级联的操作意义:将多个numpy数组进行横向或者纵向拼接
axis轴向的理解
0:列 y轴方向,竖直方向
1:行 x轴方向,水平方向
问题:
级联的两个数组维度一样,但是行列个数不一样会如何?
#axis=0列和列进行拼接,axis=1行和行进行拼接
np.concatenate((arr,arr),axis=1)
array([[21, 36, 62, 40, 52, 54, 21, 36, 62, 40, 52, 54],
[91, 45, 40, 35, 17, 98, 91, 45, 40, 35, 17, 98],
[48, 49, 36, 59, 47, 36, 48, 49, 36, 59, 47, 36],
[80, 66, 77, 21, 1, 80, 80, 66, 77, 21, 1, 80],
[18, 32, 55, 0, 32, 12, 18, 32, 55, 0, 32, 12]])
np.concatenate((arr,arr),axis=0)
array([[21, 36, 62, 40, 52, 54],
[91, 45, 40, 35, 17, 98],
[48, 49, 36, 59, 47, 36],
[80, 66, 77, 21, 1, 80],
[18, 32, 55, 0, 32, 12],
[21, 36, 62, 40, 52, 54],
[91, 45, 40, 35, 17, 98],
[48, 49, 36, 59, 47, 36],
[80, 66, 77, 21, 1, 80],
[18, 32, 55, 0, 32, 12]])
级联的两个数组维度一样,但是行列个数不一样会如何?
如果横向级联保证行数一致,纵向级联保证列数一致
注意:维度不一致的数组无法级联
arr_new = np.random.randint(0,100,size=(5,5))
array([[29, 43, 36, 67, 32],
[63, 65, 31, 90, 55],
[13, 59, 3, 3, 22],
[55, 26, 10, 5, 80],
[27, 20, 61, 75, 23]])
arr
array([[21, 36, 62, 40, 52, 54],
[91, 45, 40, 35, 17, 98],
[48, 49, 36, 59, 47, 36],
[80, 66, 77, 21, 1, 80],
[18, 32, 55, 0, 32, 12]])
np.concatenate((arr,arr_new), axis=0) #这样就会报错他俩列数不同
np.concatenate((arr,arr_new), axis=1) #先写的数组元素在前
array([[21, 36, 62, 40, 52, 54, 29, 43, 36, 67, 32],
[91, 45, 40, 35, 17, 98, 63, 65, 31, 90, 55],
[48, 49, 36, 59, 47, 36, 13, 59, 3, 3, 22],
[80, 66, 77, 21, 1, 80, 55, 26, 10, 5, 80],
[18, 32, 55, 0, 32, 12, 27, 20, 61, 75, 23]])
图片的9宫格
img_arr3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
img_arr9= np.concatenate((img_arr3,img_arr3,img_arr3), axis=0)
plt.imshow(img_arr9)
常用的聚合操作
sum求和、max最大值、min最小值、mean均值
#sum求和、max最大值、min最小值、mean均值,它们4个用法一致
arr.sum()#计算所有元素的和
1340arr.sum(axis=0) #计算每列元素的和
array([258, 228, 270, 155, 149, 280])
arr.sum(axis=1) #计算每行元素的和
array([265, 326, 275, 325, 149])
常用的数学函数
NumPy 提供了标准的三角函数及反三角函数:sin()、cos()、tan()
numpy.around(a,decimals) 函数返回指定数字的四舍五入值。
参数说明:
a: 数组
decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
np.sin([3.5,4.6,2.1])
array([-0.35078323, -0.993691 , 0.86320937])
np.around([33.4,51.2,55.8]) #默认decimals为0
array([33., 51., 56.])
np.around([33.4,51.2,55.8], decimals=1) #decimals=1保留一位小数
array([33.4, 51.2, 55.8])
np.around([33.4,51.2,55.8], decimals=-1) #decimals=-1个位数上四舍五入
array([30., 50., 60.])
常用的统计函数
numpy.amin() 和numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。
numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)极差。
numpy.median() 函数用于计算数组 a 中元素的中位数(中值)
标准差std():标准差是一组数据平均值分散程度的一种度量。所有数据与均值的差的平方和除以元素个数开根号
公式:std = sqrt(mean((x - x.mean())**2))
如果数组是 [1,2,3,4],则其平均值为 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,结果为 1.1180339887498949。
方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。