numpy(数据计算)+pandas(数据提取)+matplotlib(可视化图表) 自学数据分析期间的学习笔记。
数据分析
为什么学习数据分析
1.有岗位需求
2.python数据科学的基础
3.是机器学习课程的基础
数据分析流程
提出问题-准备数据-分析数据-获得结论-成果可视化
numpy学习笔记
前言:
numpy库的用途实在太广了,最近研究生新生开学,准备做一个新生的大数据分析,所以学习一下数据分析。在此总结学习笔记。
本教程大体上按照学习数据结构的方式,按照增删改查的顺序编写,以便自己复习时用,以后用到再补充。本目录格式,与思维导图保持一致,修改文档记得同步思维导图!
什么是 NumPy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
为何使用 NumPy?
快速,方便,科学计算的基础库
numpy基础
NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。我们可以使用 array() 函数创建一个 NumPy ndarray 对象。
创建 NumPy ndarray 对象
生成数组
创建一个指定数组
1
t1 = np.array([1,2,3])
快速生成指定数组
1
2
3
4
5
arr = np.array(range(10))#快速生成0-9的数组
arr =np.arange(10)#快速生成0-9的数组
a = np.arange(10,20,2)#10-20 步长为2
a = np.arange(12).reshape((3,4))#0-11调整数组大小3行4列
a = np.linspace(1,10,6).reshape((2,3))#从1-10平均分6段
生成随机小数
1
arr = np.array([random.random() for i in range(10)])#利用random生成numpy中的小数
保留小数位
1
t8 = np.round(t7,2)#保留2位小数
多维数组
创建一个指定的二维数组
1
array = np.array([[1,2,3],[2,3,4]])
创建一个指定的三维数组
1
t3 =np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
查看数组的形状
1
print(t3.shape)#查看数组的形状
检查数组的维数
1
print(a.ndim) #检查数组的维数
修改数组形状
1
t4 = t2.reshape(3,2)#修改数组形状
查看元素个数
1
print('size',array.size)#元素个数
展开数组
1
2
newarr = arr.flatten()#展开数组,二维变一维
newarr = arr.reshape(-1)#展开数组,二维变一维
创建指定维数的数组
1
arr = np.array([1, 2, 3, 4], ndmin=5)#创建一个有 5 个维度的数组
数据类型
1
2
3
4
print(t4.dtype)#检查数组的数据类型
arr = np.array(range(1,4),dtype="float32")#numpy中的数据类型
arr = np.array([1,1,0,1,0,0],dtype=bool)#numpy中的bool类型
t6 = t5.astype("int8")#调整数据类型
ValueError:在 Python 中,如果传递给函数的参数的类型是非预期或错误的,则会引发 ValueError。 转换已有数组的数据类型
1
newarr = arr.astype('i')#复制新数组并转换为int
随机数
随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。
生成随机整数
1
2
3
4
5
6
7
from numpy import random
x = random.randint(100)#0-100之间的随机整数
x=random.randint(100, size=(5))#生成一个 1-D 数组,其中包含 5 个从 0 到 100 之间的随机整数
x = random.randint(100, size=(3, 5))#生成有 3 行的 2-D 数组,每行包含 5 个从 0 到 100 之间的随机整数
生成随机浮点数
1
2
3
4
5
x = random.rand()#0-1之间随机浮点数
x = random.rand(5)#生成包含 5 个随机浮点数的 1-D 数组
x = random.rand(3, 5)#生成有 3 行的 2-D 数组,每行包含 5 个随机数
从数组生成随机数
1
x = random.choice([3, 5, 7, 9])#返回数组中的值之一
.seed(s)#随机数种子
数组转置
1
2
3
t.T
t.transpose()
t.swapaxes(1,0)数组索引
数组过滤filtering
1
2
arr = np.array([61, 62, 63, 64, 65]) x = [True, False, True, False, True] newarr = arr[x] #过滤掉false的元素
arr = np.array([61, 62, 63, 64, 65]) filter_arr = arr > 62 newarr = arr[filter_arr]#直接从数组创建过滤器
迭代数组
1
2
3
4
for x in np.nditer(arr): print(x)#迭代输出数组的每一个值
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S'])#以字符串形式遍历数组
for x in np.nditer(arr[:, ::2]):#每遍历 2D 数组的一个标量元素,跳过 1 个元素
for idx, x in np.ndenumerate(arr): print(idx, x)#枚举以下 1D 数组元素(带索引迭代)
1
2
3
4
5
A = np.arange(3,15).reshape(3,4)
for row in A:
print(row)#迭代每一行,按行输出
for column in A.T:
print(column)#迭代每一列。用.T转置 行变列
数组索引
访问 1-D 数组
1
2
print(arr[0])#访问第一个元素
print(arr[1])#访问第二个元素
访问 2-D 数组
1
t[2,3]#访问3行4列元素
访问 3-D 数组
1
print(arr[0, 1, 2])#访问第一个数组的第二个数组的第三个元素
布尔索引
1
t[t>10]=10
数据切片
选择行
1
2
3
t[2]#第二行
t[2:]#第二行及以后
t[3:,:]第三行及以后
选择列
1
t[:,4:]
选择行列
连续的多行
1
2
t[2:,:3]#3行后,3列前
b = t2[2:5,1:4]#取多行和多列,取第三行到第五行,第二列到第四列的结果
不连续
1
2
c = t2[[0,2,2],[0,1,3]] # 00 21 23
t[[1,3],[2,4]]#选择的是(1,2)(3,4)两个位置的值
STEP裁剪步长
1
print(arr[1:5:2])从索引 1 到索引 5,返回相隔的元素
数组赋值
按位置赋值
1
t[2:,3]=3
裁剪
1
2
3
4
t.clip(10,20)#把小于10的替换为10,大于20的替换为20
t3 = t2<10 #自动转换成bool 符合true 不符合false
t2[t2<10]=3 #把小于10的都赋值为3
t4= t2[t2>20]#取大于20的数
三元运算符
1
np.where(t>10,20,0)#把t中大于10的替换为20,其他替换为0
数组拼接Joining
1
2
3
4
5
6
7
t3 = np.vstack((t1,t2))#竖直拼接,沿列堆叠
t4 = np.hstack((t1,t2))#水平拼接,沿行堆叠
arr = np.dstack((arr1, arr2))#沿高度堆叠,该高度与深度相同
t[[1,2],:]= t[[2,1],:] #行交换
t[:,[0,2]] = t[:,[2,0]]#列交换
arr = np.concatenate((arr1, arr2))#连接两个数组(水平)
arr = np.concatenate((arr1, arr2), axis=1)#沿着行 (axis=1) 连接两个 2-D 数组
数组拆分Spliting
1
2
3
4
5
6
7
8
split()#数量不足时报错
np.split(A,2,axis=1)#把A分成2块,纵向分割,等份
array_split() #数量不足时自动调整元素
newarr = np.array_split(arr, 3)#将数组分为 3 部分,不等分割
print(newarr[0])#访问拆分的数组
newarr = np.array_split(arr, 3, axis=1)#沿行拆分
newarr = np.hsplit(arr, 3)竖直拆分
newarr = np.vsplit(arr, 3)水平拆分
数组计算
NumPy 数学函数
NumPy 提供了标准的三角函数:sin()、cos()、tan()。
舍入函数
numpy.around() 函数返回指定数字的四舍五入值。
1
numpy.around(a,decimals)#decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。
np.floor(a)
numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。
np.ceil(a)
NumPy 算术函数
1
2
3
4
5
6
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
print(a < b) print(a > b)
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。需要注意的是数组必须具有相同的形状或符合数组广播规则。
numpy.reciprocal() 函数返回参数逐元素的倒数。如 1/4 倒数为 4/1。
np.reciprocal(a)
numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。
矩阵相乘
矩阵相乘,就是矩阵的乘法操作,要求左矩阵的列和右矩阵的行数要一样,即MN维矩阵乘以和NY维矩阵
1
2
3
a = np.array([1,1],[0,1]])
b = np.arange(4).reshape((2,2))
c=a*b
点乘
矩阵点乘,就是矩阵各个对应元素相乘,要求矩阵必须维数相等,即MxN维矩阵乘以MxN维矩阵 。
1
2
c_dot = np.dot(a,b)
c_dot= a.dot(b)
广播机制broadcast
当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。
广播会在缺失和(或)长度为1的维度上进行。
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?可以
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?不可以
数组查找
1
2
3
4
5
6
x = np.where(arr == 4)#查找值为 4 的索引
x = np.where(arr%2 == 0)#查找值为偶数的索引
x = np.where(arr%2 == 1)#查找值为奇数的索引
x = np.searchsorted(arr, 7)#查找应在其中插入值 7 的索引,该方法从左侧开始搜索,并返回第一个索引,其中数字 7 不再大于下一个值。
x = np.searchsorted(arr, 7, side='right')#从右边开始查找应该插入值 7 的索引
x = np.searchsorted(arr, [2, 4, 6])#查找应在其中插入值 2、4 和 6 的索引
数组排序
1
2
3
4
a = np.sort(arr)#对数组进行排序,此方法返回数组的副本,而原始数组保持不变。
arr = np.array(['banana', 'cherry', 'apple']) print(np.sort(arr))#对数组以字母顺序进行排序
arr = np.array([True, False, True]) print(np.sort(arr))#对布尔数组进行排序
arr = np.array([[3, 2, 4], [5, 0, 1]])print(np.sort(arr))#对 2-D 数组排序
读取本地文件
不咋用,pandas大法更好用
1
2
np.loadtxt(file_path,delimiter,dtype)
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
nan和inf
nan
nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
- 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
- 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
nan注意的点
- 两个nan是不相等的
- np.nan!=np.nan
- np.count_nonzero(na.nan!=np.nan)
- nan和任何值计算都是nan
- 判断一个值是否为nan np.isnan(a)
- np.isnan(t1)效果和np.nan!=np.nan相同
inf
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
copy和view
副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。
1
2
3
4
5
a=b 完全不复制,a和b相互影响
a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
a = b.copy(),复制新数组,a和b互不影响
x = arr.view()#arr[0] = 61更改原数组,新数组也改变
x = arr.view()#x[0] = 61更改新数组,原数组也改变
检查数组是否拥有数据 print(x.base) 副本返回 None。 视图返回原始数组。
numpy常用统计方法
创建一个全0的数组: np.zeros((3,4))
创建一个全1的数组:np.ones((3,4))
创建一个对角线为1的正方形数组(方阵):np.eye(3)
以下默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
最小值位置索引:np.argmin(t,axis=1)
最大值位置索引:np.argmax(t,axis=0)
求和:t.sum(axis=None)#axis控制行或列
累加:print(np.cumsum(A))
差值:print(np.diff(A))
均值:t.mean(a,axis=None) a.mean()). np.average(A)受离群点的影响较大
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最大值和最小值之差
标准差:t.std(axis=None)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值
反映出数据的波动稳定情况,越大表示波动越大,约不稳定
numpy
列表转矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
array = np.array([[1,2,3],[2,3,4]])
print(array)
print('number of dim',array.ndim)#维数,秩
print('shape',array.shape)#nxn
print('size',array.size)#元素个数
import numpy as np
a = np.numpy([2,23,4],type=np.int64)#
print(a.dtype)
a = np.zeros((3,4))#3行4列为0的矩阵,ones-1
print(a)
a = np.arange(10,20,2)#10-20 步长为2
print(a)
a = np.arange(12).reshape((3,4))#0-11调整数组大小3行4列
print(a)
a = np.linspace(1,10,6)reshape((2,3))#分段
print(a)
数组
1
2
3
4
5
6
7
a = np.array([10,20,30,40])
b = np.arange(4)#生成0-3
print(a,b)
c = a-b #加减乘除 平方 **
d = 10*np.sin(a)#三角函数 cos tan
print(c)
print(b<3)#输出true和false
矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
a = np.array([1,1],[0,1]])
b = np.arange(4).reshape((2,2))
print(a)
print(b)
c=a*b
c_dot = np.dot(a,b)
c_dot_2 = a.dot(b)
print(c)
print(c_dot)
a = np.random.random((2,4))#2行4列的随机数0-1
print(a)
print(np.sum(a))#求和
print(np.sum(a,axis=1))#每一列 中
print(np.min(a))#最小值
print(np.sum(a,axis=0))#每一行中
print(np.max(a))#最大值
A = np.arange(2,14).reshape((3,4))
print(np.argmin(A))#最小值的索引 0
print(np.argmax(A))#最大值的索引 11
print(A)
print(np.mean(A))#平均值
print(A.mean())#同上
print(A.average())#同上
print(np.median(A))#中位数
print(np.cumsum(A))#累加
print(np.diff(A))#差值
print(np.nonzero(A))#非0
print(np.sort(A))#逐行排序
矩阵相乘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print(np.transpose(A))#行变列 列变行 3乘4 变 4乘3
print(A.T)#和上面一样
print((A.T).dot(A))#乘法运算
print(np.clip(A,5,9))#大于9都变成9。小于5变成5,保留5 9中间的数字
print(np.mean(A,axis=0))# 0 对于列计算。1对于行计算
A = np.arange(3,15)
print(A)
print(A[3])#索引(一维)
A = np.arange(3,15).reshap(3,4)
print(A)
print(A[2])#索引出第3行
print(A[2] [1])#索引出第3行的第1列
print(A[2,1])#同上
print(A[:,1])#索引出第1列所有的
print(A[1,1:3])#索引出第2行第2-3个数
for row in A:
print(row)#迭代每一行
for column in A.T:
print(column)#迭代每一列。用.T转置
合并
1
2
3
4
5
6
7
A = np.array([1,1,1])
B = np.array([2,2,2])
C = np.vstack((A,B)) #vertical stack 上下合并,输出2*3的数组
D = np.hstack((A,B))#horizontal stack左右合并,
print(A.shape,D.shape)
print(A[np.newaxls].shape)#前面加一个维度
分割
1
2
3
4
5
6
7
A = np.arange(12).reshape(3,4))
print(A)
print(np.split(A,2,axis=1))#把A分成2块,纵向分割,等份
print(np.array_split(A,3,axis=1))#不等分割
print(np.vsplit(A,3))#纵向分割
print(np.hsplit(A,2))#横向分割
赋值
1
2
3
4
5
6
7
a = np.arange(4)
b=a
c=a
d=b
a[0]=11#所有变量都会改
d[1:3] = [22,33]
b = a.copy() #deep copy b不随a关联,