- 科学计算库Numpy
- 高效的运算工具,核心的数据结构是ndarray
- 基本操作
- ndarray.方法()
- numpy.函数名()或np.函数名()
- ndarray的运算
- 逻辑运算
- 统计运算
- 数组间运算
💫什么是Numpy
num-numerical
py-python
数值计算的python库
它是一个由多维数组对象和用于处理数组的例程集合组成的库。(用于快速处理任意维度的数组)
支持常见的数组和矩阵操作
Numpy提供了一个N维数组类型,它描述了相同类型的"item"的集合
import numpy as np
score = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 91],
[90, 34, 54, 55, 46],
[57, 86, 97, 66, 43],
[24, 53, 64, 21, 64]])
print(score)
💫基本操作
ndarray优势
简而言之,NumPy的优势在于计算,但是对于数据处理并不好,所以数据处理将会使用Panda
- 存储风格
- ndarray-所有元素必须是相同类型-故通用性不强
- list-可以是不同类型-故通用性很强
- ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就使得批量操作数组元素时速度更快
- 这是因为ndarray中的所有元素类型都是相同的,而python列表中的元素是任意的,所以ndarray在存储元素的时候内存可以连续,而python原生list就只能通过寻址方法找到下一个元素
- 并行化运算
- ndarray支持向量化运算
- 底层语言
- numpy底层使用c语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制
🐣🐣ndarray属性
属性 | |
---|---|
ndarray.shape | 数组维度的元组 |
.size | 数组中的元素数量 |
.ndim | 数组维数 |
ndarray.dtype | 数组元素的类型 |
.itemsize | 一个数组元素的长度(字节) |
(2,3)二维
(4,)一维
(2,2,3)三维
形状的修改
ndarray.reshape((10,8))
- 这个只是对原数据进行了重新分割,并没有转置(行列转换)
- 返回了新的adarray,原始数据不修改
ndarray.resize()
- 修改效果跟reshape一样
- 没有返回值,只会对原数据修改
ndarray.T()
- 真正的数组转置
- 返回新的adarray
类型的修改
ndarray.astype("type")
- 可转换为任意类型
ndarray.toString()
- 转换成bytes序列化到本地
创建数组时指定类型
在数组后逗号写比如,dtype=np.float32
或者,dtype="float32"
🐣🐣生成数组的方法
- 生成0和1的数组
- 从现有数组中生成
- 生成固定范围的数组
- 生成随机数组
1.生成0和1的数组
目的主要是为了生成空数组
方法:
np.zeros(shape)
,生成0np.ones(shape)
,生成1
- 形状既可用元组表达(),也可用列表[]
2.从现有数组中生成
np.array()
,深拷贝(原数组改变,拷贝数组不变)np.copy()
,深拷贝np.asarray()
,浅拷贝(原数组改变,拷贝数组也变)
3.生成固定范围的数组
np.linspace(左,右,生成个数)
,左闭右也闭,等距离(相除,每个数等距离)np.arange(左,右,步长)
,左闭右开
4.生成随机数组
重点在于确定它的分布状况
np.random模块
- 均匀分布(每组可能性相等)
np.random.uniform(low=0.0,high=1.0,size=100)
- 左闭右开
- 左默认值为0,右默认值为1(均为float类型)
- size:输出样本数目,为int或元组(tuple)类型
- 返回值ndarray类型
- 正态分布
np.random.normal(loc=0.0,scale=1.0,size=None)
- loc为均值,也就是对称轴(float)
- scale为标准差,标准差越小越瘦高(float)
- size形状
案例:数组的索引和切片
随机生成8只股票10日的交易日涨幅数据
import numpy as np
#创建
stock_change=np.random.normal(loc=0.0,scale=1,size=(8,10))
#获取第一个股票的前三日的涨幅数据
print(stock_change[0,0:3])#如果切片开头是0,可以省略冒号前的0
数组的去重
ndarray.unique()
或np.unique()
- 去重还有一个方法是
set()
,但是只能用于一维数组,如果是多维就想用set,就需要先转成一维,再set
- set(temp.flatten()),得到的是集合
💫ndarray运算
🐣🐣逻辑运算
操作符合某一条件的数据
- 运算符
import numpy as np
#创建
stock_change=np.random.normal(loc=0.0,scale=1,size=(8,10))
print(stock_change)
#逻辑运算
print(stock_change>0.5)#返回布尔数据
print(stock_change[stock_change>0.5])#通过布尔索引返回符合要求的数
stock_change[stock_change>0.5]=1.1
print(stock_change) #把原数据符合条件的值都修改为1.1
- 通用判断函数
返回值都是布尔类型
np.all()
需要在范围内的所有数据都符合
#是否这部分股票全为上涨
print(np.all(stock_change[0:2,0:5]>0))
np.any()
只要在范围内有数据符合即可
print(np.any(stock_change[0:2, :]>0))
- 三元运算符
np.where(布尔值,Ture位置的值,False位置的值)
#判断前四个股票前四天的涨跌幅,大于0的置为1,否则为0
temp=stock_change[:4,:4]
print(temp)
print(np.where(temp>0,1,0))
- 复合逻辑需要结合
np.logical_and
和np.logical_or
使用
# 判断前四个股票前四天的涨跌幅,大于0.5并且小于1的置为1,否则为0
print(np.where(np.logical_and(temp>0.5,temp<1),1,0))
🐣🐣统计运算
如果想要知道涨幅最大或跌幅最大的数据
- 统计指标函数
- np.min、max、mean(平均值)、median(中位数)、var(方差)、std(标准差)
- 返回最大值、最小值所在位置(索引返回过来)
- np.argmax、argmin
- np.argmax、argmin
🐣🐣数组间运算
1.数组与数的运算
对数组直接运算,其会作用到数组里的每一个元素
arr=np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(arr+2)
2.数组与数组的运算
前提是两数组形状必须相同
22.Broadcast广播机制
为了不同形状的ndarray进行运算
当操作两个数时,numpy会逐个比较它们的shape,只有在下面这个情况下,两个数组才能进行数组与数组的运算
- 维度相同
- shape(其中有对应的位置,两者至少1个为1)
最终形状取每个维度最大的
matrix矩阵运算
必须是二维的
矩阵一定是二维数组,但二维数组不一定是矩阵
1. 存储矩阵:
np.mat()
,将数组转换成矩阵np.array
,还是数组
1. 矩阵乘法运算:
矩阵乘法有两个关键:
- 形状改变 (m,n)x(n,l)
- 运算规则 (m,n)x(n,l)=(m,l)
计算:
- 如果用的是
np.array
来存储矩阵的,用这两种方法计算:- np.matmul
- np.dot
- 如果用的是
np.mat()
来存储矩阵的- 直接
数组名_mat * 数组名_mat
- 或者
数组名 @ 数组名
- 直接
💫合并、分割
合并
- 水平合并
np.hstack(())
- 竖直合并
np.vstack(())
- axis()轴
np.concatenate((),axis=0)
- 0是竖直,1是水平
分割
np.arange(x,n)
,n代表被分成n个np.split(x,[a,b,c...])
,传一个列表,列表里abc代表分割处的索引值
💫IO操作和数据处理
目标: 知道NumPy文件的读取
因为 大多数数据并不是我们自己构造的,而是存在于文件当中,需要我们用工具获取
但是其实NumPy并不适合用来读取和处理数据,因此我们这里了解相关API,以及NumPy不方便的地方即可
NumPy读取
读取数据
但是np会有很多无法读取出来(比如字符串),所以不用这个
test=np.genfromtxt("test.csv",delimiter=',')
#传的分别是文件路径和分隔符
如何处理缺失值
nan缺失值是一个浮点型
- 样本数据足够大时,可 直接删除 含有缺失值的样本
- 样本较少时,用替换(插补)法
- 也就是算出这一列的平均值,填到nan缺失值处