【Python数据挖掘】第三篇--Numpy 和 可视化
一、Numpy
数组是一系列同类型数据的集合,可以被非零整数进行索引,可以通过列表进行数组的初始化,数组也可以通过索引进行切片。
Numpy提供了几乎全部的科学计算方式。
# numpy 导入方式: import numpy as np
①、创建数组:
1.简单一二维数组
np.array( [1,2,3,4] ) # 一维数组 np.array( ['1',5,True] ) # 数组内容为字符型 np.array( [True,True] ) # 布尔型数组 np.array( [[1,2,3,4] , [5,6,7,8]] ) # 二维数组
2.范围函数生成 一维数组:
np.arange([start,] stop[, step,], dtype=None) np.arange(1,10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
3.均分函数生成 一维数组:(等差数列)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) start : 初始值 stop : 末尾值 num : 生成的样本数 , 必须为非负数 endpoint : 默认True , 数组最后一个元素为 stop项 # 数组step计算: 当 endpoint = True 时, step = (end - start) / (num - 1) 当 endpoint = False 时, step = (end - start) / num np.linspace(1,10,num=5,endpoint=False) # array([ 1. , 2.8, 4.6, 6.4, 8.2])
4.创建元素为1 的数组
np.ones(4) # 一维数组 array([ 1., 1., 1., 1.]) np.ones([4,5]) # 二维数组 4行5列
5.创建元素为0 的数组
np.zeros(4) # 一维数组 array([ 0., 0., 0., 0.]) np.zeros([4,5]) # 二维数组 4行5列
6.创建一定形状的数组
numpy.empty(shape, dtype=float, order='C') np.empty([2,3]) # 创建2行3列数组
7.创建方阵型,行列相等,对角元素为1,其余元素为0
np.eye(4) # 4行4列 , 元素为0 , 对角线元素为1 array([[ 1., 0., 0., 0.], [ 0., 1., 0., 0.], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]])
8.创建与某数组大小相同的数组,元素为0
arr1 = np.eye(4) # 4行4列 arr2 = np.empty_like(arr1) # 4行4列
9.Series转换Array
np.array(series)
②、Numpy下的random类创建 随机数组
1.创建符合 [0:1) 均匀分布 的数组
np.random.rand(d0, d1, ..., dn) np.random.rand(4,5) # 4行5列数组
2.创建符合 标准正态分布 的数组
np.random.randn(d0, d1, ..., dn) np.random.randn(4,5) # 4行5列数组
3.创建 随机整数 的数组 , (不包含)
np.random.randint(low, high=None, size=None, dtype='l') np.random.randint(5, size=(2, 4)) # 生成0到4之间的 2 x 4数组 array([[4, 0, 2, 1], [3, 2, 2, 0]])
4.创建 随机整数 的数组 , (包含)
np.random.random_integers(low, high=None, size=None) np.random.random_integers(5, size=(2, 4)) # 生成1到5之间的 2 x 4数组 array([[3, 3, 4, 3], [3, 4, 1, 5]])
5.创建 [0.0,1.0) 随机浮点数
np.random.random(size=None) np.random.random_sample(size=None) np.random.ranf(size=None) np.random.sample(size=None) np.random.random( (5,) ) np.random.random_sample( (4,5) ) # 4行5列 浮点数数组
6.从给定的1-D数组 生成随机样本
np.random.choice(a, size=None, replace=True, p=None) p:1-D array-like,可选 ( 设置概率 )与a中的每个条目相关联的概率。如果没有给出样本,则假设在a中的所有条目均匀分布。 np.random.choice(5, 3) # 从np.arange(5)生成大小为3的均匀随机样本: np.random.choice(5, 3, replace=False) # 从np.arange(5)生成大小为3的均匀随机样本,没有重复: aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher'] np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
7.返回随机字节
np.random.bytes(length) np.random.bytes(10) # b'u\x1e\xd6\x8d\xf5]\xab6\xed\x0c'
③、重要属性
np.shape # 查看数组的维度 如: (4,) 一个数字代表1维 , (5,6) 代表二维,5行6列数组 , ..... np.size # 查看数组元素总个数 np.ndim # 查看数组维度数 len(array) # 查看数组行数
④、重要方法
1. 给定条件判断元素
numpy.where(condition[, x, y]) # 根据条件,从x或y返回元素。 np.where(arr1 > 0 , True , False ) array([[False, True, True, False], [ True, False, False, False], [ True, True, True, False]], dtype=bool)
2.查找数组唯一元素
np.unique(ar, return_index=False, return_inverse=False, return_counts=False)[source] return_counts = True # 返回出现次数
np.unique([1, 1, 2, 2, 3, 3]) # array([1, 2, 3]) a = np.array([[1, 1], [2, 3]]) np.unique(a) # array([1, 2, 3])
3.两个数组连接
np.concatenate((a1, a2, ...), axis=0) # 沿现有轴连接数组序列。 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) np.concatenate((a, b), axis=0) array([[1, 2], [3, 4], [5, 6]]) np.concatenate((a, b.T), axis=1)
⑤、索引与切片
⑥、数组计算
1.加法
a = np.array([1,2,3]) b = np.array([-1,2,-4]) np.add(x1, x2[, out]) = <ufunc 'add'> np.add(a,b) # 等效于 a + b # array([ 0, 4, -1])
2.减法
np.subtract(x1, x2[, out]) = <ufunc 'subtract'> np.subtract(a,b) # a - b
3.乘法
np.multiply(x1, x2[, out]) = <ufunc 'multiply'> np.multiply(a,b) # a * b
4.除法
np.divide(x1, x2[, out]) = <ufunc 'divide'> np.divide(a,b) # a / b
5.点积 (相乘后把元素相加)
两矩阵的点积 需要 左边矩阵列 与 右边矩阵行 数目相等
np.dot(a, b, out=None) np.dot(a,b) np.dot(a,b.T)
6.广播
两矩阵相加 , 类型shape不一样时 , 自动广播计算 ,作用在每一行每个元素
arr1 = np.random.randint(1,10,size=(3,4)) array([[3, 3, 4, 1], [8, 4, 8, 2], [6, 4, 4, 9]]) arr2 = np.array([2,2,2,2]) array([2, 2, 2, 2]) arr1 + arr2 array([[ 5, 5, 6, 3], [10, 6, 10, 4], [ 8, 6, 6, 11]]) # 方式二 : arr1 + 6 # 每个元素都加6
7.求和
np.sum(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue>) # 给定轴上的数组元素的总和。 np.sum([0.5, 1.5]) # 2.0 np.sum([[0, 1], [0, 5]], axis=0) # array([0, 6]) np.sum([[0, 1], [0, 5]], axis=1) # array([1, 5])
8.求平均
np.mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue>) # 沿指定轴计算算术平均值。 a = np.array([[1, 2], [3, 4]]) np.mean(a) # 2.5 np.mean(a, axis=0) # array([ 2., 3.])
9.求平方根
np.sqrt(x[, out]) = <ufunc 'sqrt'> # 按元素方式返回数组的正平方根。 np.sqrt([1,4,9]) # array([ 1., 2., 3.])
10.求指数
np.exp(x[, out]) = <ufunc 'exp'> # 计算输入数组中所有元素的指数。
11.求绝对值
np.absolute(x[, out]) = <ufunc 'absolute'> # 逐个计算绝对值。 x = np.array([-1.2, 1.2]) np.absolute(x) # array([ 1.2, 1.2])
12.求自然对数
np.log(x[, out]) = <ufunc 'log'> # 自然对数,逐元素。
⑦、线性代数计算
1.数组转置
arr1 = np.random.randint(0,10,size=(4,4)) np.transpose(arr1) # arr1.T
2.矩阵的逆
a = np.array([[1,2],[4,7]]) np.linalg.inv(a) array([[-7., 2.], [ 4., -1.]])
3.沿数组的对角线返回总和
a = np.array([[1,2],[4,7],[5,2]]) np.trace(a) # 8
4.正方形数组的特征值和右特征向量
w, v = np.linalg.eig(np.array([ [1, -1], [1, 1] ])) w; v array([ 1. + 1.j, 1. - 1.j]) array([[ 0.70710678+0.j , 0.70710678+0.j ], [ 0.00000000-0.70710678j, 0.00000000+0.70710678j]])
二、可视化
①、matplotlib 导入方式: 👉官方文档
import matplotlib.pyplot as plt
②、条形图
plt.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs) y = np.array([10,20,30,50]) x = np.arange(len(y)) plt.bar(x,y,color='r') # 垂直方向 plt.show() plt.barh(x,y,color='r') # 水平方向 plt.show()
③、多图形排列
y = np.random.randint(10,100,size=(4,4)) x = np.arange(4) plt.bar(x,y[0],color='r',width=0.25) plt.bar(x+0.25,y[1],color='b',width=0.25) plt.bar(x+0.5,y[2],color='g',width=0.25) plt.show()
④、图形堆叠
plt.bar(x,y[0],color='r') plt.bar(x,y[1],color='y',bottom=y[0]) plt.bar(x,y[2],color='g',bottom=y[0] + y[1])
⑤、散点图
data = np.random.rand(1024,2) plt.scatter(data[:,0],data[:,1]) plt.show()
⑥、直方图
x = np.random.rand(1000) plt.hist(x,bins=50) # 显示50条 plt.show()
⑦、箱形图
x = np.random.randn(100,5) plt.boxplot(x) plt.show()
注意:
numpy数组计算中*和dot是有很大区别的
1.numpy乘法运算中"*"是数组元素逐个计算具体代码如下:
2.numpy乘法运算中dot是按照矩阵乘法的规则来运算的具体实现代码如下: