什么是数据分析:
- 数据分析就是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律
数据分析三剑客(模块):
- Numpy, Pandas, Matplotlib
Numpy简介:
Numpy (Numerical Python) 是python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
一、Numpy的使用:
导入bunpy模块:
import numpy as np 起一个别名,通常叫做 np
创建数组的方式:
1. 使用np.array()创建基于一位或多维数组的创建(调用函数array创建数组)
一位数组的创建:
np.array([1,2,3,4,5,6])
结果:array([1, 2, 3, 4, 5, 6])
二维数组的创建:
np.array([[1,2,3],[4,"a",6],[7,8,9]]) 结果:array([['1', '2', '3'], ['4', 'a', '6'], ['7', '8', '9']], dtype='<U11')
注意:
1.numpy默认ndarray的所有元素的类型都是相同的
2.如果传进列表中的元素包含不同的类型,则统一为统一类型,
优先级:str > float > int
3.在创建数组的时候,尽量保持数组的完整性
2.使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片,操作该numpy数据,该操作会同步到图片中
import matplotlib.pyplot as plt 导入matplotlib.pyplot,并起别名为plt
# 导入matplotlib.pyplot,并起别名为plt import matplotlib.pyplot as plt # plt.imread('mwh.jpg') # 可以将图片使用imread打印, 其结果是一个三维数组 img_arr = plt.imread('mwh.jpg') # 将打印出来的三维数组赋值于img_arr plt.imshow(img_arr) # 将获取的三维数组,以图片的形式显示出来,
plt.imshow(img_arr -20) 改变图片的相术
img_arr.shape # 拿到的是三维数组的形状,前两个表示是图片的相术,最后一个表示的是颜色
结果:(413, 295, 3)
3.使用np(numpy)的routines函数创建 包含以下常见的创建方法
3.1 np.ones(shape, dtype=None, order='C')
np.ones(shape=(4,5)) # 创建一个内容为1的四行五列的二维数组
3.2 zeros(shape, dtype=float, order='C')
np.zeros(shape=(4,5)) # 创建一个内容为0的四行五列的二维数组
3.3 np.full(shape, fill_value, dtype=None, order='C')
np.full(shape=(5,6),fill_value=8) # 创建一个可以指定内容的二维数组
3.4 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
np.linspace(1,100,num=10) # 创建等差数列,得到的是一维数组,num表示创建的个数
3.5 arange([start,] stop [, step,], dtype=None)
np.arange(0,100,2) #从0到100 每隔2个数,娶一个值,返回的是一维数组
3.6 np.random.randint(low, high=None, size=None, dtype='l')
np.random.seed(10) # 固定时间种子,产生的随机数就固定下来了,不再发生改变
np.random.randint(0,100,size=(5,7)) # 在0—100内随机取数字,创建一个5行7列的二维数组
3.7 np.random.randn(d0, d1, ..., dn) 标准正太分布
np.random.randn(4,5) #返回一个4行5列的二维数组的标准正太分布
3.8 np.random.random(size=None) 生成0到1的随机数,左闭右开
二、ndarray的属性
4个必记:
参数: ndim:
维度 shape: 形状(各维度的长度)
size:总长度
dtype:元素类型
一个简单示例: np.random.seed(10) arr = np.random.randint(0,100,size=(4,5)) 生成一个四行五列的二维数组 arr.ndim # 表示数组的参数个数 结果:2 arr.size # 该二维数组的长度 结果:20 arr.dtype # 当前二位数组中元素的类型 结果:dtype('int32') arr.shape # 当前生成二维数组的行数和列数 结果:(4,5)
三、ndarray的基本操作之上部
1. 索引 一维与列表完全一致 多维时同理
注意: 索引是从0开始的
创建一个二维数组 np.random.seed(10) arr = np.random.randint(0,100,size=(4,5)) arr 结果: array([[ 9, 15, 64, 28, 89], [93, 29, 8, 73, 0], [40, 36, 16, 11, 54], [88, 62, 33, 72, 78]]) arr[2][3] 结果:11 arr[1][2] 结果:8
根据索引修改数据
arr[1][2] = 100
arr
结果:
array([[ 9, 15, 64, 28, 89],
[ 93, 29, 100, 73, 0],
[ 40, 36, 16, 11, 54],
[ 88, 62, 33, 72, 78]])
2. 切片 一维与列表完全一致 多维时同理
创建一个六行四列的二维数组 arr = np.random.randint(60,120,size=(6,4)) arr 结果: array([[ 83, 90, 116, 71], [ 88, 70, 84, 69], [ 75, 78, 76, 114], [ 67, 84, 71, 77], [106, 67, 71, 88], [ 93, 80, 118, 92]]) #获取二维数组前两行 arr[0:2] 结果: array([[ 83, 90, 116, 71], [ 88, 70, 84, 69]]) #获取二维数组前两列 arr[:,0:2] 结果: array([[ 9, 15], [93, 29], [40, 36], [88, 62]]) #获取二维数组前两行和前两列数据 arr[0:2,0:2] 结果: array([[83, 90], [88, 70]])
将数据反转 例如[1,2,3]---->[3,2,1] :: 进行切片
创建一个二维数组
arr = np.random.randint(60,120,size=(6,4))
arr
结果:
array([[ 83, 90, 116, 71],
[ 88, 70, 84, 69],
[ 75, 78, 76, 114],
[ 67, 84, 71, 77],
[106, 67, 71, 88],
[ 93, 80, 118, 92]])
#将二位数组的行倒序
arr[::-1]
结果:
array([[ 93, 80, 118, 92],
[106, 67, 71, 88],
[ 67, 84, 71, 77],
[ 75, 78, 76, 114],
[ 88, 70, 84, 69],
[ 83, 90, 116, 71]])
#将二维数组的列倒序
arr[:,::-1]
结果:
array([[ 71, 116, 90, 83],
[ 69, 84, 70, 88],
[114, 76, 78, 75],
[ 77, 71, 84, 67],
[ 88, 71, 67, 106],
[ 92, 118, 80, 93]])
#全部倒叙
arr[::-1,::-1]
结果:
array([[ 92, 118, 80, 93],
[ 88, 71, 67, 106],
[ 77, 71, 84, 67],
[114, 76, 78, 75],
[ 69, 84, 70, 88],
[ 71, 116, 90, 83]])
对图片进行导致操作 :: 操作
获取一张图片
img_arr = plt.imread('./cat.jpg')
plt.imshow(img_arr)
#将图片进行行倒置操作
plt.imshow(img_arr[::-1])
#将图片进行列倒置操作
plt.imshow(img_arr[:,::-1])
#将图片进行颜色倒置操作
plt.imshow(img_arr[:,:,::-1])
#将图片进行全倒置操作
img_arr.shape
plt.imshow(img_arr[::-1,::-1,::-1])
# 自定义图片,注意:自定义图片的时候imshow中的数据类型必须是浮点型
aaa = np.random.randint(0,255,size=(200,200,3))
plt.imshow(aaa+0.1)
· 3. 变形
使用arr.reshape()函数,注意参数是一个tuple!
基本使用:
3.1 将一维数组变形成多维数组
生成一个一维数组:
abc =np.array([1,2,3,4,5,6,7,8,9,10,11,12])
abc
结果:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
# 将一维数组转换成二位数组,-1表示自动计算行数/列数,也可以自己计算
abc.reshape(4,-1)
结果:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
abc.reshape(-1,4)
结果:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
3.2 将多维数组变形成一维数组
生成一个二位数组 np.random.seed(10) arr = np.random.randint(60,120,size=(6,4)) arr 结果: array([[ 69, 96, 75, 60], [109, 119, 88, 85], [ 89, 108, 89, 109], [118, 68, 69, 60], [102, 100, 114, 96], [111, 76, 96, 107]]) arr1 = arr.reshape(24) # 24表示的是二维数中的元素个数 arr1 # 将二维数组转化成一位数组 结果: array([ 69, 96, 75, 60, 109, 119, 88, 85, 89, 108, 89, 109, 118, 68, 69, 60, 102, 100, 114, 96, 111, 76, 96, 107]) # 将一维数组转换成三维数组 arr2 = arr1.reshape(2,4,3) arr2 结果: array([[[ 69, 96, 75], [ 60, 109, 119], [ 88, 85, 89], [108, 89, 109]], [[118, 68, 69], [ 60, 102, 100], [114, 96, 111], [ 76, 96, 107]]]) arr2.reshape(24) #将三维数组转化成一维数组 结果: array([ 69, 96, 75, 60, 109, 119, 88, 85, 89, 108, 89, 109, 118, 68, 69, 60, 102, 100, 114, 96, 111, 76, 96, 107])
4.级联
np.concatenate()
参数:axis=0:轴向 0表示的是竖直的轴向 1水平的轴向
4.1 一维,二维,多维数组的级联,实际操作中级联多为二维数组
对arr二维数组进行竖直的级联
np.concatenate((arr,arr),axis=0)
结果:
array([[ 69, 96, 75, 60],
[109, 119, 88, 85],
[ 89, 108, 89, 109],
[118, 68, 69, 60],
[102, 100, 114, 96],
[111, 76, 96, 107],
[ 69, 96, 75, 60],
[109, 119, 88, 85],
[ 89, 108, 89, 109],
[118, 68, 69, 60],
[102, 100, 114, 96],
[111, 76, 96, 107]])
对arr二维数组进行水平的级联
np.concatenate((arr,arr),axis=1)
结果:
array([[ 69, 96, 75, 60, 69, 96, 75, 60],
[109, 119, 88, 85, 109, 119, 88, 85],
[ 89, 108, 89, 109, 89, 108, 89, 109],
[118, 68, 69, 60, 118, 68, 69, 60],
[102, 100, 114, 96, 102, 100, 114, 96],
[111, 76, 96, 107, 111, 76, 96, 107]])
将两个不同的二维数组进行级联
注意:
1. 进行级联操作的时候,所输入的数组维度必须相同,
2. 同维度的数组进行级联的时候,其行和列必须是相同格式
创建一个二位数组
np.random.seed(10)
arr = np.random.randint(60,120,size=(6,4))
arr
结果:
array([[ 69, 96, 75, 60],
[109, 119, 88, 85],
[ 89, 108, 89, 109],
[118, 68, 69, 60],
[102, 100, 114, 96],
[111, 76, 96, 107]])
创建第二个二维数组
arr1 = np.random.randint(0,100,size=(3,4))
arr1
结果:
array([[47, 2, 39, 96],
[23, 21, 95, 97],
[63, 81, 32, 93]])
将aar和arr1两个二位数组进行级联
np.concatenate((arr,arr1),axis=0)
结果:
array([[ 69, 96, 75, 60],
[109, 119, 88, 85],
[ 89, 108, 89, 109],
[118, 68, 69, 60],
[102, 100, 114, 96],
[111, 76, 96, 107],
[ 47, 2, 39, 96],
[ 23, 21, 95, 97],
[ 63, 81, 32, 93]])
创建一个一维数组
arr2 = np.array([1,2,3,4])
arr2
结果:
array([1, 2, 3, 4])
将arr1和arr2进行级联
np.concatenate((arr1,arr2),axis=0)
结果会报错
注意:
1. 进行级联操作的时候,所输入的数组维度必须相同,
2. 同维度的数组进行级联的时候,其行和列必须是相同格式
4.2 使用np.concatenate()函数,合并两张图片
导入模块 matplotlib.pyplot
# 导入matplotlib.pyplot,并起别名为plt import matplotlib.pyplot as plt img_arr = plt.imread('./cat.jpg') plt.imshow(img_arr)
结果:显示出一张图片
进行两张图片的列合并
# 两张图片的列合并 arr = np.concatenate((img_arr,img_arr),axis=0) plt.imshow(arr)
结果:
进行两张图片的行合并:
# 两张图片的行合并 arr1 = np.concatenate((img_arr,img_arr),axis=1) plt.imshow(arr1)
# 拼接一个九宫格图片框架
# 拼接一个九宫格图片框架 arr = np.concatenate((img_arr,img_arr,img_arr),axis=0) arr1 = np.concatenate((arr,arr,arr),axis=1) plt.imshow(arr1)
结果:
4.3.np.hstack与np.vstack的使用
ystack的使用: a = np.vstack((arr,arr)) plt.imshow(a) hstack的使用: a = np.hastack((arr,arr)) plt.imshow(a)
级联需要注意的点:
- 级联的参数是列表:一定要加中括号或小括号
- 维度必须相同
- 形状相符:在维度保持一致的前提下,如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致。如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致。
- 可通过axis参数改变级联的方向