Python科学计算库Numpy

1 介绍

  • Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
  • Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
  • Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

1.1 ndarray

Numpy提供了一个N dimension array,即n维数组

1.2 numpy与list对比

  1. 存储风格:

    ndarray 内部存储类型相同,存储空间连续,但通用性不强

    list 内部存储类型可以不同,存储空间未必连续,通用性较强

  2. 并行化计算:ndarray支持向量化运算

  3. 底层语言:
    Numpy底层采用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。

属性方法

属性名字属性解释
ndarray.shape数组维度的元组
ndarray.ndim数组维数
ndarray.size数组中的元素数量
ndarray.itemsize一个数组元素的长度(字节)
ndarray.dtype数组元素的类型
使用方法 数组名.函数名

2 基本操作

2.1 ndarray形状和类型

形状

import numpy as np
a = np.array([[1,2,3],[4,5,6]])   #(2,3)
b = np.array([1,2,3,4])			   #(4,)
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])#(2,2,3)
print(a.shape)
print(b.shape)
print(c.shape)

元组:表示外到内的元素个数,维度就是括号层数。

运行结果
在这里插入图片描述

类型

创建数组时指定即可

# 创建数组的时候指定类型
np.array([1.1, 2.2, 3.3], dtype="float32")

2.2 生成数组

  • 生成0 1 数组
  # 1 生成0和1的数组
  a=np.zeros(shape=(3, 4), dtype="float32")
  
  ##其中shape的参数为列表/元组均可,用于表示生成的数组维度

运行结果
在这里插入图片描述

  • 从现有数组生成
  a1=np.array(a)  #深拷贝
  a2=np.copy(a)   #深拷贝
  a3=np.asarray(a)#浅拷贝
  a4=a			#浅拷贝
  • 生成固定范围的数组
a1=np.linspace(0, 10, 5)  # 生成[0,10]之间等距离的5个数,左右均为闭区间
a2=np.arange(0, 11, 5)  # [0,11),5为步长生成数组 ,左闭右开
print(a1)
print(a2)

在这里插入图片描述

  • 生成随机数组
# 生成均匀分布的一组数[low,high)  左闭右开,size是数量
data1 = np.random.uniform(low=-1, high=1, size=1000000)
########注意这两处的size都可以规定数组形状  size=(8,100)
# 生成正态分布的一组数,loc:均值;scale:标准差,size数量
data2 = np.random.normal(loc=1.75, scale=0.1, size=1000000)
print(data1)
print(data2)

运行结果
在这里插入图片描述

2.3 索引切片

stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
# 获取第一个股票的前3个交易日的涨跌幅数据
print(stock_change[0, :3])
a[1, 0, 2] = 1000
a[1][0][2] = 1000

2.4 形状改变

stock_change.reshape((10, 8)) # 返回新的ndarray, 原始数据没有改变
stock_change.resize((10, 8)) # 没有返回值, 对原始的ndarray进行了修改
stock_change.T # 转置 行变成列,列变成行  返回一个ndarray,原数据未改变


##reshape()是一个函数,因此第一个括号是函数个括号,而第二个括号是因为传入了一个元##组,其实用列表也可

2.5 类型修改

stock_change.astype("int32")
stock_change.tostring() # ndarray序列化到本地??????

2.6 数组去重

temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
np.unique(temp)
set(temp.flatten())##set的操作对象需要时一维的,.flatten()可以压缩为一维的

在这里插入图片描述

3 ndarray运算

3.1 逻辑运算

  • 运算符
stock_change = np.random.uniform(low=-1, high=1, size=(5,10))
# 逻辑判断, 如果涨跌幅大于0.5就标记为True 否则为False
stock_change > 0.5     
#返回一个True和False的等大小矩阵

stock_change[stock_change > 0.5] = 1.1  
#将>0.5的全部改为1
  • 通用判断函数

    #以下两者均只返回一个布尔值
    
    # 判断stock_change[0:2, 0:5]是否全是上涨的
    np.all(stock_change[0:2, 0:5] > 0) 
    # 判断前5只股票这段期间是否有上涨的
    np.any(stock_change[:5, :] > 0)
    
  • 三元运算符

    # np.where(布尔表达式,True的位置的值,False的位置的值),类似于三元运算符,不# 过需要利用函数
    np.where(temp > 0, 1, 0)
    ###涉及符合逻辑需要额外的函数logical_and/or
    # 大于0.5且小于1
    np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
    # 大于0.5或小于-0.5
    np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3)
    

3.2 统计运算

  • 主要函数:min max mean median(中位数) var(方差) std(标准差)
  • 使用方法:np.函数名(数组名) 或 数组名.方法名
  • 同时应当注意 axis的使用。 axis=0表示列 axis=1表示行 axis=-1 表示最后一维度
###返回值
stock_change.max()  #将返回最大值
np.max(stock_change,axis=1)#将返回一个向量,即所有行的最大值


###返回索引
np.argmax(tem,axis=0)
np.argmin(tem,axis=0)

3.3 数组运算

  • 数组与数字的运算

    正常的运算即可 加减乘除等

  • 数组与数组的运算

    广播机制

    执行broadcast的前提在于,两个nadarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。

    当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。

    • 维度相等
    • shape(其中相对应的一个地方为1)

具体解释解释就是看这个图。

比如(不一定是乘法)数组A*B,将两者的维度写出,如下,将维度从尾部开始对齐,则满足运算的要求是:

  1. 对应的维度相同
  2. 若维度不同,则其中一个维度应当为1

在这里插入图片描述

矩阵运算

  • 可以通过np.mat(array)将数组转化为矩阵

  • 矩阵的乘法必须满足运算规则,即(m,n)*(n,l)=(m,l)

    如果是二维数组实现矩阵运算

    np.dot(data,data1)
    np.matmul(data,data1)
    data @ data1
    

    如果是矩阵进行运算

    data1*data2
    1
    

3.4 数组合并分割

  • numpy.hstack 水平拼接

  • numpy.vstack 竖拼接

  • numpy.concatenate((a1,a2),axis=0|1) 水平|竖拼接

    np.hstack((a, b))
    np.vstack((a, b))
    np.concatenate((a, b), axis=1)
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵广陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值