数据挖掘之最全Numpy相关知识
一、概念
1、简介
Numpy是一个开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器
2、软件推荐(Jupyter Notebook)
使用Jupyter Notebook,是IPython的加强网页版,一个开源Web应用程序,是一款程序员和科学工作者的编程/文档/笔记/展示软件。
.ipynb文件格式是用于计算型叙述的JSON文档格式的正式规范
3、软件下载网址以及参考文档
跳转链接:Jupyter官网
对于新手而言一般用Anacomda上的Jupyter,如果不知道如何安装Anaconda软件的话,可以参考我写的Anaconda+tensorflow最有实效总结版(重装6次的血泪总结)
二、基本操作
1、ndarray
NumPy提供了一个N维数组类型ndarray,描述了相同类型的"items"的集合
1.1 ndarray基本使用
# 导入numpy包
import numpy as np
score = np.array([[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,30],
[31,32,33,34,35],
[36,37,38,39,40]])
score
结果
1.2 ndarray与Python原生list运算效率
(1)先生成一个超大数组
import numpy as np
import random
import time
# 先生成一个大数组
python_list = []
for i in range(100000000):
python_list.append(random.random())
ndarray_list = np.array(python_list)
ndarray_list
结果
(2)通过两种方式求和比较时间
# 原生python list求和
t1 = time.time()
a = sum(python_list)
t2 = time.time()
d1 = t2 -t1
# ndarray求和
t3 = time.time()
b = np.sum(ndarray_list)
t4 = time.time()
d2 = t4 - t3
结果
(3)结论
Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。
1.3 ndarray与Python原生list存储风格
(1)ndarray
只能存储相同类型的数据,类似于java里的数组,顺序存储,通用性不强。
(2)list
可以存储不同类型的数据,指向不同的位置,无序存储,通用性很强。
1.4 并行化运算
ndarray支持向量化运算
1.5 底层语言
Numpy底层使用C语言编写,内部解除了GIL
1.6 ndarray属性
数组属性反映了数组本身固有的信息
ndarray.shape 数组维度的元组
-- ndarray.ndim 数组维数
-- ndarray.size 数组中的元素数量
ndarray.itemsize 一个数组元素的长度(字节)
-- ndarray.dtype 数组元素的类型
(1)相关代码
# 导入numpy包
import numpy as np
score = np.array([[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,30],
[31,32,33,34,35],
[36,37,38,39,40]])
score.shape
score.ndim
score.size
score.dtype
score.itemsize
结果
1.7 ndarray的形状
(1)一维数组
b = np.array([1,2,3,4])
b.shape
结果
(2)二维数组
a = np.array([[1,2,3],[4,5,6]])
a.shape
结果
(3)三维数组
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
c.shape
结果
1.8 ndarray的类型
(1)创建数组的时候指定类型
方式一
np.array([1.1,2.2,3.3], dtype="float32")
结果
方式二
np.array([1.1,2.2,3.3], dtype=np.float32)
结果
2、生成数组的方法
2.1 生成值都为0的数组
import numpy as np
# 1、生成0的数组
np.zeros(shape=(3,4), dtype="float32")
结果
2.2 生成值都为1的数组
import numpy as np
# 1、生成1的数组
np.ones(shape=[2,3], dtype="int32")
结果
2.3 从现有的数组生成
(1)浅拷贝
原来的数组中某个数值变化了,该数组同样也会变化。
相当于索引的形式,并没有真正的创建一个新的
新数组名 = np.asarray(原数组名)
相关代码
import numpy as np
score2 = np.array([[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,30],
[31,32,33,34,35],
[36,37,38,39,40]])
# np.asarray()
data1 = np.asarray(score2)
data1
结果
(2)深拷贝
从原有的数组中,创建一个新的数组
方式一
新数组名 = np.array(原数组名)
方式二
新数组名 = np.copy(原数组名)
相关代码
data2 = np.array(score2)
data3 = np.copy(score2)
结果
(3)修改数据后
重新赋值后
score2[1,1] =1000
结果如下,只有浅拷贝的数据发生了变化,深拷贝的数据没发生变化
3、生成固定范围的数组
3.1 方法一
np.linspace(0,10,5)
结果
3.2 方法二
np.arange(0,11,5)
结果
4、生成随机数组
4.1 均匀分布
均匀分布表示可能性相等的含义
相关代码
import numpy as np
import random
import matplotlib.pyplot as plt
data1 = np.random.uniform(low=-1, high=1, size=1000000)
# 1、创建画布
plt.figure(figsize=(20,8),dpi=80)
# 2、绘制直方图
plt.hist(data1,1000)
# 3、显示图像
plt.show()
结果
4.2 正态分布
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ, σ)。
标准差越小,离散程度越小,稳定性越好。
相关代码
import numpy as np
import random
import matplotlib.pyplot as plt
# 正态分布
data4 = np.random.normal(loc=1.75, scale=0.1, size=1000000)
# 1、创建画布
plt.figure(figsize=(20,8),dpi=80)
# 2、绘制直方图
plt.hist(data4,1000)
# 3、显示图像
plt.show()
结果
5、切片索引与形状修改
5.1 切片索引
相关代码
首先进行伪随机
import numpy as np
stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
结果
(1)切片索引
stock_change[0,:3]
结果
(2)根据位置索引
stock_change[0,2]
结果
5.2 形状修改
(1)ndarray.reshape(shape)
返回新的ndarray,原始数据没有改变
stock_change.reshape((10,8))
结果
(2)ndarray.resize(shape)
没有返回值,对原始的ndarray进行了修改
stock_change.resize((10,8))
结果
(3)stock_change.T
转置,行变成列,列变成行
stock_change.T
结果
6、类型修改
6.1 ndarray序列化到本地
stock_change.astype("int32")
6.2 转换为byte类型
# 先转换为byte类型
stock_change.tostring()
7、数组的去重
7.1 np.unique(数组名)
对于一维数组或者列表,np.unique() 函数 去除其中重复的元素 ,并按元素 由小到大 返回一个新的无元素重复的元组或者列表。
7.2 相关代码
import numpy as np
temp = np.array([[1,2,3,4],[3,4,5,6]])
np.unique(temp)
结果
7.3 拓展
flatten()是对多维数据的降维函数。
其中flatten(dim)表示,从第dim个维度开始展开,将后面的维度转化为一维.也就是说,只保留dim之前的维度,其他维度的数据全都在dim这一维。
temp.flatten()
降维后去重
set(temp.flatten())
三、ndarray运算
1、逻辑运算
1.1 布尔索引
#生成随机数组
arr = np.random.normal(loc=0, scale=1, size=(8,10))
# 将符合逻辑条件的值赋值为1
arr[arr > 0.5] = 1
# 输出arr
arr
结果
1.2 通用判断函数
(1)np.all(布尔值)
只要有一个False就返回False,只有全是True才返回True
相关代码
# 判断这个区间是否 全部 大于0
np.all(arr[0:2, 0:5] > 0)
结果
(2)np.any(布尔值)
只要有一个True就返回True,只有全是False才返回False
相关代码
# 判断这个区间是否 有 大于0的
np.any(arr[0:2, 0:5] > 0)
结果
1.3 三元运算符(np.where)
np.where(布尔值, True的位置的值, False的位置的值)
(1)满足大于0的数,真赋为1,假赋为0
np.where(arr > 0,1,0)
结果
(2)满足大于0.2且小于1的数,真赋为1,假赋为0
np.where(np.logical_and(arr>0.2 , arr<1), 1, 0)
结果
(3)满足大于0.5,或小于负0.5,真赋为1,假赋为0
np.where(np.logical_or(arr>0.5 , arr<-0.5), 1, 0)
结果
2、统计运算
2.1 基础操作
(1)最大值
# 最大值
arr.max()
结果
(2)最小值
# 最小值
arr.min()
结果
(3)标准差
# 标准差
arr.std()
结果
(4)方差
# 方差
arr.var()
结果
(5)平均值
# 平均值
arr.mean()
结果
(6)求和
# 求和
arr.sum()
结果
(7)根据axis来改变行或列得出结果
arr.max(axis=0)
结果
(8)找到最大值的索引
np.argmax(arr,axis=0)
结果
(5)找出最小值的索引
np.argmin(arr,axis=0)
结果
2.2 数组间运算
(1)数组与数的运算
相关代码
import numpy as np
arr = np.array([[1,2,3,2,1,4],[5,6,1,2,3,1]])
# 全都加1
arr + 1
# 全都除以2
arr / 2
结果
(2)广播机制(Broadcast)
广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组a和b形状相同,即满足a.shape == b.shape,那么a*b的结果就是a与b数组对应位相乘。(要求:维数相同,各维度的长度相同)
相关代码
a = np.array([[0.0, 0.0, 0.0],
[10.0,10.0,10.0],
[20.0,20.0,20.0],
[30.0,30.0,30.0]])
b = np.array([1.0,2.0,3.0])
a + b
结果
更便捷的计算方式
c = np.array([0.0, 10.0, 20.0, 30.0])
d = np.array([1.0,2.0,3.0])
a[:, np.newaxis] + b
结果
2.3 矩阵运算
矩阵和array的区别矩阵必须是2维的,但是array可以是多维的。(数组之间不能够直接运算的)
np.mat() 将数组转换成矩阵类型
2.3.1 两种方法存储矩阵
(1)ndarray存储矩阵
# ndarray存储矩阵
data = np.array([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]
])
data
结果
(2)matrix存储矩阵
# matrix存储矩阵
data_mat = np.mat([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]
])
data_mat
结果
2.3.2 矩阵乘法运算
(1)形状改变
(m, n) * (n, l) = (m, l)
设A为mp的矩阵,B为pn的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB
(2)矩阵乘法api
np.matmul
np.matmul(data, weight)
结果
np.dot
np.dot(data, weight)
结果
2.4 合并与分割
(1)先定义两个二维数组
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[3,4,5],[6,7,8]])
结果
(2)水平方向合并
方式一(np.hstack())
np.hstack((a,b))
结果
方式二(np.concatenate(, axis=1))
np.concatenate((a,b), axis=1)
结果
(3)竖直方向合并
方式一(np.vstack())
np.vstack((a,b))
结果
方式二(np.concatenate(, axis=0))
np.concatenate((a,b), axis=0)
结果
(4)分割
场景一(np.split(x,3))
x = np.arange(9.0)
np.split(x,3)
结果
场景二(np.split(x, [3,5,6,10]))
x = np.arange(8.0)
np.split(x, [3,5,6,10])
结果
未完待续