今年,最长的一个假期。在家把线性代数,高等数学,概率统计又复习了一遍,
顺便还在阿里公开课上找到了很多视频,就把python进行数据处理的所有内容
全部看了一遍,之后又把Linux系统操作学习了一遍,最近准备刷第二遍,然后
顺便把所有内容总结下来~
最近,在网上学习了一下阿里出品的人工智能学习路线
系列。收获很大,需要总结一下。
今天总结python数据处理三剑客numpy,pandas,matplotlib
之一的——numpy
。
Numpy学习
Numpy的名字实际上有两个部分构成,即:Numpy=num+py
- num-numerical 数值化的
- py-python
该库提供了一个N维数组类型ndarray,即:ndarray=n+d+array
- n-任意个
- d-dimension 维度
- array-数组
其支持常见的数组和矩阵操作,因此对于同样的数值计算任务,使用Numpy要比直接使用Python要简洁的多!
首先,是这次学习的主要流程图:
1. Numpy的优势
学习一个库之前,我们要了解为啥要使用这个库,它有什么优势呢?这样能提高我们的学习动力。
我们做一个测试:
import numpy as np
import random
import time
#生成一个大数组
python_list = []
for i in range(100000000):
python_list.appent(random.random())
ndarray_list = np.array(python_list)
# 原生pythonlist求和
t1 = time.time()
a = sum(python_list)
t2 = time.time()
consume1 = t2 - t1
# ndarray 求和
t3 = time.time()
b = np.sum(ndarray_list)
t4 = time.time()
consume2 = t4 - t3
print('python原生数组求和消耗时间是ndarray求和消耗时间的%s倍。'% str(consume2/consume1))
为什么会这样呢?听我细细道来。
1.1 内存块风格
ndarray - 类型相同,通用性不强 list - 类型不同,通用性强
使用list虽然通用性强,但是其内部存的是引用方式,元素之间的并不是连续存放的,因此在查找的时候没有ndarray高。
1.2 支持并行化运算
ndarray支持向量化运算
1.3 底层语言
底层是C语言实现的,内部解除了GIL(全局解释器锁),其对数组的操作不受Python解释器的限制,效率远高于纯Python代码。
2. ndarray的属性
2.1 最重要属性
- shape————形状
- ndim——维度
- size——元素个数
- dtype————类型
- itemsize———一个类型所占用的字节大小
创建ndarray时,没有指定类型时,默认:
- 整数 int64
- 浮点数 float64
3. 基本操作
主要以下两种形式进行操作:
- ndarray.方法()
- np.函数()
3.1 生成数组的方法
3.1.1 生成0和1的数组
np.zeros(shape)
np.ones(shape)
3.1.3 从现有数组中生成
深拷贝:
np.array()
np.copy()
浅拷贝:
np.asarray()
3.1.3 生成固定范围数组
np.linspace(0,10,100) -- 0到10等距离100个
np.arange(a,b,c) --- c是步长
3.1.4 生成随机数
np.random模块
- 均匀分布
- np.random.rand(d0,d1,d2……dn) 通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。 1)当函数括号内没有参数时,则返回一个浮点数; 2)当函数括号内有一个参数时,则返回秩为1的数组,不能表示向量和矩阵; 3)当函数括号内有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵;
- np.random.uniform(low= , high= , size= ):生成均匀分布在low到high的size个数的数组
- 正态分布
- np.random.randn(0,d1,d2……dn) 类似均匀分布
- np.random.normal(loc= , scale= , size) 类似均匀分布
3.2 切片索引
直接对应维度操作跟python普通列表一样!
3.3 形状修改
- ndarray.reshape(shape) 返回新的,原始数据没有变
- ndarray.resize(shape) 无返回,原始数据变了
- ndarray.T 返回新的,原始数据没有变
3.4 类型修改
ndarray.astype(np.type/'Type str')
ndarray.tostring() - 转换成byte返回
3.5 数组去重
np.unique()
或
set(ndarray.flatten())
4. 运算
4.1 逻辑运算
-
布尔索引 比如找到所有大于一个数的数据:
ndarray[ndarray > 需要的数]
显然python原生list只能用for循环实现 - 通用判断函数
- np.all(布尔值) 只要有一个False就返回False,只有全是True才返回True
- np.any() 只要有一个True就返回True,只有全是False才返回False
- 三元运算符 np.where(a,b,c) a是一个位置的布尔值,True为b,False为c
4.2 统计运算
4.2.1 统计指标
min,max,mean,median,var,std
- np.~()
- ndarray.~()
~代表上面的min,max etc. 注意使用时,axis要指定清楚!
4.2.2 最大、小值所在位置
np.argmax(ndarray,axis=)
np.argmin(ndarray,axis=)
4.3 数组间运算
-
数组与数的运算 ndarray +/-/*/除 number 直接每个元素进行运算
-
数组与数组的运算 下面重点介绍!
4.3.1 广播机制
- 维度相同
Image(3d array) (256,256,3)
Scale(1d array)
Result(3d array) (256,256,3)
A 9, 1, 7, 1
B 8, 1, 5
Re 9, 8, 7, 5
上述中(8,1)(7,1)(1,5)均有一个是1
- shape(其中相对应的一个地方为1)
4.4 矩阵运算
同线性代数
np.matmul()
np.dot()
5. 合并和分割
- 合并
np.hstack()
np.vstack()
np.concatenate()
- 分割 np.split()