1、Python 数据分析-NumPy科学计算
1、简介:
1.1、什么是数据分析
- 把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律,它在生活中处处都能遇到,形影不离。
- 使得数据的价值最大化
- 分析用户的消费行为
- 制定促销活动的方案
- 制定促销时间和粒度
- 计算用户的活跃度
- 分析产品的回购力度
- 分析广告点击率
- 决定投放时间
- 制定广告定向人群方案
- 决定相关平台的投放
- ......
- 分析用户的消费行为
- 使得数据的价值最大化
- 数据分析是用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取适当的行动
- 保险公司从大量赔付申请数据中判断哪些为骗保的可能
- 支付宝通过从大量的用户消费记录和行为自动调整花呗的额度
- 短视频平台通过用户的点击和观看行为数据针对性的给用户推送喜欢的视频
1.2、数据分析实现流程
-
提出问题
-
准备数据
-
分析数据
-
获得结论
-
成果可视化
2、数据分析三剑客
- NumPy
- Pandas【*】
- Matplotlib
3、numpy模块
- NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。
- Python中的列表属于高级数组,跟数组一样,都属于容器
4、numpy安装
pip install numpy
5、numpy的操作
导入:
import numpy as np
np.array()创建
array()创建一个一维数组
arr_1 = np.array([1,2,3,4])
>>>
array([1, 2, 3, 4])
array()创建一个二维数组
arr_1 = np.array([[1,2,3,4],[5,6,7,8]])
>>>
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
多维数组就是列表中嵌套多个列表
- 数组和列表的区别是什么?
- 数组中存储的数据元素类型必须是统一类型
- 优先级:
- 字符串 > 浮点型 > 整数
6、plt查看矩阵
引用matplotlib的pyplot模块查看图片的数组
import matplotlib.pyplot as plt
plt.imread('./dog.jpg')
>>>
array([[[183, 175, 172],
[183, 175, 172],
[182, 174, 171],
... ... ...
[ 97, 64, 57],
[ 97, 64, 57],
[ 97, 64, 57]]], dtype=uint8)
- 将外部的一张图片读取加载到numpy数组中,
import matplotlib.pyplot as plt
dog_arr = plt.imread('./dog.jpg')
plt.imshow(dog_arr)
尝试改变数组元素的数值查看对原始图片的影响
import matplotlib.pyplot as plt
dog_arr = plt.imread('./dog.jpg')
plt.imshow(dog_arr-100)
7、numpy的routines函数构造矩阵几种方式细致解析
- zero()
- ones()
- linespace()
- arange()
- random系列
zero()
zeros()返回一个全0的n维数组,一共有三个参数:shape(用来指定返回数组的大小)、dtype(数组元素的类型)、order(是否以内存中的C或Fortran连续(行或列)顺序存储多维数据)。后两个参数都是可选的,一般只需设定第一个参数。
import numpy as np
np.zeros(5)
>>>
array([ 0., 0., 0., 0., 0.])
np.zeros((5,), dtype=np.int)
>>>
array([0, 0, 0, 0, 0])
np.zeros((2, 1))
>>>
array([[ 0.],
[ 0.]])
ones()
ones()返回一个全1的n维数组,同样也有三个参数:shape(用来指定返回数组的大小)、dtype(数组元素的类型)、order(是否以内存中的C或Fortran连续(行或列)顺序存储多维数据)。后两个参数都是可选的,一般只需设定第一个参数。和zeros一样
np.ones(5)
>>>
array([ 1., 1., 1., 1., 1.])
np.ones((5,), dtype=np.int)
>>>
array([1, 1, 1, 1, 1])
np.ones((2, 1))
>>>
array([[ 1.],
[ 1.]])
linespace()
生成指定范围内指定个数的一维数组
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None):
- 在指定的间隔[“start”,“stop”]内均匀地返回数字。
- “num”返回num个等间距的样本。
- endpoint是一个bool类型的值,如果为"Ture",“stop"是最后一个值,如果为"False”,生成的数组不会包含"stop"值
- retstep是一个bool类型的值,如果为"Ture",会返回样本之间的间隙。
其他相似的函数
- arange 和 linespace 相似,但是使用步长而不是样本的数量来确定生成样本的数量。
np.linspace(2.0, 3.0, num=5)#等差数列返回一个一维数组
>>>
array([ 2. , 2.25, 2.5 , 2.75, 3. ])
np.linspace(2.0, 3.0, num=5, endpoint=False)
>>>array([ 2. , 2.2, 2.4, 2.6, 2.8])
np.linspace(2.0, 3.0, num=5, retstep=True)
>>>
(array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
arange()
返回一个有终点和起点的固定步长的排列
1)一个参数时,终点,起点默认值0,步长默认值1。
2)两个参数时,起点,终点,步长默认值1。
3)三个参数时,起点,终点,步长。其中步长支持小数
np.arange(5)
>>>
array([0, 1, 2, 3, 4])
np.arange(5,8)
>>>
array([5, 6, 7])
np.arange(5,15,3)
>>>
array([ 5, 8, 11, 14])
random系列
np.random.randint(low, high=None, size=None, dtype='l')
作用:生成指定区间[low, high)的随机整数
参数:
-- low: 最小值,int型
-- high: 最大值,int型
-- size: 数组维度,int型或由int构成的tuple型
-- dtype: 数据类型,默认为np.int
返回:int型或者由int构成的ndarray
np.random.randint(4) # 只有一个参数,默认生成一个[0, 4)的随机整数
>>>3
np.random.randint(1, 4) # 两个参数,生成一个在[1, 4)的随机整数
>>>
2
np.random.randint(4,size=3) # 生成3个[0, 4)的随机整数
>>>
array([0, 2, 3])
np.random.randint(-2,5,size=(2,4)) # 在[-2,5]区间上,生成shape为2*4的随机整数
>>>
array([[ 2, 0, 0, 2],
[ 1, -2, 1, 3]])
np.random.rand(d0, d1, ..., dn)
作用:生成[0, 1)之间的指定形状的随机浮点数
参数:d0, d1, ..., dn,int类型,如不写则返回单个随机数
返回:ndarray类型,形状(d0, d1, ..., dn)
np.random.rand() # 没有参数则直接生成一个[0,1)区间的随机数
>>>
0.1065982531337718
np.random.rand(3) # 只有一个参数则生成n*1个随机数
>>>
array([0.24640203, 0.81910232, 0.79941588])
np.random.rand(2, 3, 4) # 有多个参数,则生成对应形状随机数,如本例生成shape为2*3*4的随机数
>>>
array([[[0.73222489, 0.80656115, 0.65878337, 0.69227656],
[0.84919565, 0.24966801, 0.48942496, 0.22120944],
[0.98766801, 0.94405934, 0.03942681, 0.70557517]],
[[0.92524832, 0.18057535, 0.56794523, 0.9154883 ],
[0.03394598, 0.69742027, 0.29734901, 0.9243962 ],
[0.97105825, 0.94426649, 0.47421422, 0.86204265]]])
np.random.randn(d0, d1, ..., dn)
作用:生成指定形状,服从标准正态分布(均值为0,标准差为1)的随机数
参数:d0, d1, ..., dn,int型,如不写则返回单个标准正态分布实例
返回:ndarray类型,形状(d0, d1, ..., dn)
np.random.randn() # 没有参数则直接随机生成一个标准正态分布实例
>>>
0.4125703966441225
np.random.randn(3) # 只有一个参数则生成n*1的服从标准正态分布的随机数
>>>
array([-1.9296846 , -0.65058484, 1.04354591])
np.random.randn(2, 3, 4) # 有多个参数,则生成对应形状标准正态分布随机数,如本例生成shape为2*3*4的服从标准正态分布的随机数
>>>
array([[[ 0.86776502, 0.28303221, -1.34946357, 0.58550346],
[ 0.71339959, 0.04701721, 1.22317095, -0.68343179],
[-0.50985758, -2.48461158, 0.91982751, 0.31386196]],
[[-1.68182033, -1.758599 , -0.87263063, 0.79365794],
[-0.30036049, -0.80478692, -1.00611589, -1.05091196],
[-1.9336783 , -1.20739583, -1.07057808, 0.68262324]]])
np.random.random(size=None)
作用:从给定的一维数组中生成随机数
参数:
-- a: 一维数组或int型
-- size: 数组维度,int型或由int构成的tuple型
-- replace: 布尔型,False时生成的随机数无重复
-- p: 为a的数据设置概率,不设置时默认为均匀分布
返回:单个样本或多个样本构成的ndarray类型
np.random.random() # 没有参数,直接生成一个[0, 1)区间随机浮点数
>>>
0.15893828327675652
np.random.random(3) # 一个参数,生成[0, 1)区间shape为3*1的随机浮点数
>>>
array([0.77282278, 0.23005368, 0.13133513])
np.random.random(size=(3, 4)) # tuple型参数,生成[0, 1)区间shape为3*4的随机浮点数
>>>
array([[0.86805432, 0.96323665, 0.03130231, 0.73127007],
[0.90952451, 0.85736009, 0.96452047, 0.76009408],
[0.44229876, 0.31195199, 0.32074274, 0.72442267]])
np.random.choice(a, size=None, replace=True, p=None)
作用:从给定的一维数组中生成随机数
参数:
-- a: 一维数组或int型
-- size: 数组维度,int型或由int构成的tuple型
-- replace: 布尔型,False时生成的随机数无重复
-- p: 为a的数据设置概率,不设置时默认为均匀分布
返回:单个样本或多个样本构成的ndarray类型
np.random.choice([1, 3, 5, 7]) # 只有一个参数a,从a中随机选一个
>>>
7
np.random.choice([1, 3, 5, 7], size=2) # 指定size,从a中随机选2个
>>>
array([1, 7])
np.random.choice([1, 3, 5, 7], size=(2, 3)) # size为tuple,从a中随机选2*3个
>>>
array([[5, 3, 3],
[1, 1, 3]])
np.random.choice([1, 2, 3, 4, 5, 6, 7, 8, 9], size=(2, 3), replace=False) # replace设置为false时,生成的随机数不重复
>>>
array([[7, 2, 6],
[4, 1, 5]])
np.random.choice([1, 2, 3, 4], size=2, p=(0.1, 0.2, 0.3, 0.4)) # 设置p,根据p的权重随机挑选
>>>
array([4, 4])
更多详细用法参照官方文档:https://numpy.org/devdocs/reference/
8、numpy的常用属性
- shape #返回数组的形状:几行几列
- ndim #返回数组的维度
- size #返回数组元素中总共有多少个元素
- dtype #返回的是数组元素的数据类型
a = np.arange(15).reshape(3, 5)
>>>
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
a.shape
>>>
(3, 5)
a.ndim
>>>
2
a.size
>>>
15
a.dtype
>>>
dtype('int32')
9、numpy的数据类型
- array(dtype=?):可以设定数据类型
- arr.dtype = '?':可以修改数据类型
arr = np.array([1,2,3],dtype="int64")
>>>
dtype('int64')
arr.dtype = 'float32'
>>>
dtype('float32')
10、numpy的索引和切片操作
10.1、索引操作
a = np.arange(15).reshape(3, 5)
a
>>>
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
a[2][1] #索引取值
>>>
11
10.2、切出前两行数据
a = np.arange(15).reshape(3, 5)
a[:2]
>>>
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
10.3、切出前两列数据
a = np.arange(15).reshape(3, 5)
a[:,0:2] #逗号左边是数组的第一个维度,右边是第二个维度
>>>
array([[ 0, 1],
[ 5, 6],
[10, 11]])
10.4、切出前两行的前两列的数据
a = np.arange(15).reshape(3, 5)
a[:,0:2]
>>>
array([[0, 1],
[5, 6]])
10.5、数组数据翻转
a = np.arange(15).reshape(3, 5)
print(a) #多维显示
>>>
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
a[::-1] #行倒置
>>>
array([[10, 11, 12, 13, 14],
[ 5, 6, 7, 8, 9],
[ 0, 1, 2, 3, 4]])
a[:,::-1] #列倒置
>>>
array([[ 4, 3, 2, 1, 0],
[ 9, 8, 7, 6, 5],
[14, 13, 12, 11, 10]])
a[::-1,::-1] #行列倒置
>>>
array([[14, 13, 12, 11, 10],
[ 9, 8, 7, 6, 5],
[ 4, 3, 2, 1, 0]])
10.6、将一张图片上下左右进行翻转操作
#将图片上下翻转
import matplotlib.pyplot as plt
dog_arr = plt.imread('./dog.jpg')
plt.imshow(dog_arr[::-1])
#将图片左右翻转
import matplotlib.pyplot as plt
dog_arr = plt.imread('./dog.jpg')
plt.imshow(dog_arr[:,::-1,:])
#将图片颜色进行反转
import matplotlib.pyplot as plt
dog_arr = plt.imread('./dog.jpg')
plt.imshow(dog_arr[:,:,::-1])
10.7、将图片进行指定区域的裁剪
11、变形reshape
- 注意:变形前和变形后数组元素的个数是不可以改变
b = np.random.randint(0,100,size=(4,6))
>>>
array([[66, 7, 47, 0, 34, 19],
[74, 99, 41, 49, 85, 1],
[88, 78, 43, 78, 57, 93],
[68, 67, 70, 55, 68, 14]])
b.reshape((3,8))
>>>
array([[59, 18, 21, 42, 33, 6, 20, 92],
[92, 10, 39, 7, 27, 37, 90, 64],
[95, 95, 73, 72, 94, 2, 60, 11]])
b.reshape((2,-1)) #-1表示自动计算
>>>
array([[54, 75, 43, 89, 18, 38, 60, 6, 82, 29, 40, 41],
[27, 35, 64, 16, 18, 53, 26, 84, 6, 94, 14, 67]])
12、级联操作concatenate函数
- 将多个numpy数组进行横向或者纵向的拼接
- axis轴向的理解
- 0:控制列
- 1:控制行
- 问题:
- 级联的两个数组维度一样,但是行列个数不一样会如何?
- 必须保证行或列相同的情况下进行级联操作,否则报错
- 级联的两个数组维度一样,但是行列个数不一样会如何?
c = np.random.randint(0,20,size=(3,4))
d = np.random.randint(0,20,size=(3,2))
np.concatenate((c,d),axis=1)
>>>
array([[ 2, 14, 12, 11, 0, 12],
[ 8, 12, 5, 3, 7, 0],
[10, 0, 13, 9, 0, 18]])
12.1、制作图片九宫格
import matplotlib.pyplot as plt
dog_arr = plt.imread('./dog.jpg')
arr_3 = np.concatenate((dog_arr,dog_arr,dog_arr),axis=1)
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)
plt.imshow(arr_9)
13、 常用的聚合操作
sum,max,min,mean
d = np.random.randint(0,20,size=(3,2))
print(d)
d.sum(axis=1)#求所有行的和
>>>
[[10 3]
[ 3 3]
[ 8 2]]
array([13, 6, 10])
d = np.random.randint(0,20,size=(3,2))
print(d)
axis = 0#求所有列的和
>>>
[[16 16]
[ 5 4]
[ 4 15]]
array([25, 35])
d = np.random.randint(0,20,size=(3,2))
print(d)
axis = None#求所有元素的和
>>>
[[ 4 18]
[ 3 10]
[ 9 8]]
52
常用的数学函数
- NumPy 提供了标准的三角函数:sin()、cos()、tan()
- numpy.around(a,decimals) 函数返回指定数字的四舍五入值。
- 参数说明:
- a: 数组
- decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
- 参数说明:
d = np.random.randint(0,20,size=(3,2))
print(d)
np.around(d,decimals=-1)
>>>
[[10 12]
[ 1 13]
[16 19]]
array([[10, 10],
[ 0, 10],
[20, 20]])
14、常用的统计函数
- 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)。换句话说,标准差是方差的平方根。