当前位置: 首页 > news >正文

机器学习 | 深入探索Numpy的高性能计算能力

目录

初识numpy

numpy基本操作

数组的基本操作

ndarray运算

数组间运算

矩阵


初识numpy

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

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。它描述了相同类型的“item”的集合。ndarray 对象是在连续的内存块中分配的,因此访问和处理元素的速度比 Python 的原生列表更快,以下是ndarray与原生python在效率上的对比:

import random
import time
import numpy as npa = []
for i in range(100000000):a.append(random.random())
# 通过%time魔法方法,查看当前行的代码运行一次所花费的时间
%time suml = sum(a)
b = np.array(a)
%time sum2 = np.sum(b)

机器学习最大的特点就是大量的数据运算,那么没有一个快速的解决方案的话,那可能现在的py也在机器学习领域达不到好的效果。 Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

从下图我们可以看出:ndarray在存储数据的时候,数据与地址都是连续的,这样就使得批量操作数据元素时速度更快,而python原生list就只能通过寻址方式找到下一个元素。

以下是ndarray的常用属性介绍:

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

以下根据表格的情况,进行下面的测试来验证常用属性的使用

numpy基本操作

以下解释使用numpy的一些基本操作:

生成0,1数组:我们也可以通过numpy生成特殊的0,1数组操作:

生成现有数组:通过下面的方式将现有的数组生成ndarray形式:

a = np.array([[1,2,3], [4,5,6]])
# 从现有的数组中创建
a1 = np.array(a)
# 相当于索引的形式,并没有真正的创建一个新的
a2 = np.asarray(a)

array和asarray的不同在于,array是深拷贝而asarray是浅拷贝,如下:

生成固定范围数组:通过numpy的函数生成一个固定范围的数组

生成随机数组:生成随机数组采用正态分布的方式进行,生成正态分布的方式有以下三种:

# 返回一组均匀分布的数
np.random.randn(d0, d1,..., dn)# loc:此概率分布的均值(对应着整个分布的中心centre)
# scale:此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
# size:输出的shape,默认为None,只输出一个值
np.random.normal(loc=0.0,scale=1.0,size=None)# 一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
# low:采样下界; high:采样上界; size:输出样本数目 返回值:ndarray类型
np.random.uniform(low=0.0,high=1.0,size=None)# 返回指定形状的标准正态分布的数组。
np.random.standard_normal(size=None)# 从一个均匀分布中随机采样,生成一个整数或N维整数数组。
# 取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
np.random.randint(low,high=None,size=None,dtype='/")

在正态分布当中,我们采用如下的例子:

在均匀分布当中,我们采用如下的例子:

我们也可以模拟一组均值为0,方差为1的在某个正态分布内的数据:

数组的基本操作

当我们使用numpy生成ndarray数组后,如何对数组进行相应的操作呢?如下开始讲解:

数组的索引切片:直接对某维数组进行索引和切片,然后返回我们想要的数据:

形状修改: 修改数组的形状可以采用如下的三种方式:

# 返回一个具有相同数据域,但shape不一样的视图,行、列不进行互换
ndarray.reshape(shape,order)

# 修改数组本身的形状(需要保持元素个数前后相同),行、列不进行互换
ndarray.resize(new_shape)

# 数组的转置,将数组的行、列进行互换
ndarray.T

类型修改:通过如下的方式修改数组的类型

数组去重:如果想数组去重的话可以采用如下的方式进行

ndarray运算

通过ndarray运算,我们可以筛选符合某一条件的数据,以下是使用的一些常用方法:

逻辑运算:逻辑运算可以采用如下的方式进行筛选数组

将大于60的值赋值为1:

通用判断函数:通用判断函数可以采用如下的方式进行筛选数组

三目运算符:三目运算符可以采用如下的方式进行筛选数组

统计运算:统计运算可以采用如下的方式进行筛选数组

数组间运算

我们也可以通过numpy实现数组与数、数组与数组以及数组间运算的广播机制等操作。

数组与数运算:可以看如下操作

数组与数组运算:数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:

广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。

1)数组的某一维度等长。

2)其中一个数组的某一维度为1。

矩阵

在numpy中进行矩阵相乘的api是:

np.matmul、np.dot

np.matmul和np.dot的区别:

二者都是矩阵乘法。np.matmul中禁止矩阵与标量的乘法。在矢量乘矢量的内积运算中,np.matmul与np.dot没有区别。

相关文章:

  • 【LeetCode: 148. 排序链表 + 链表 + 归并排序】
  • ffmpeg 实用命令 -- 设置预览图
  • 【.NET Core】深入理解任务并行库 (TPL)
  • 使用ajax异步获取下拉列表的值
  • 单片机中MCU跑RTOS相比裸机的优势
  • 网安渗透攻击作业(1)
  • 不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路
  • Linux的权限(三)
  • 数据库学习命令总结(持续更新)
  • 倍增算法笔记
  • python07-Python的数字类型之浮点类型
  • 如何解决服务器端口被占用的问题,减少带来的影响
  • 如何在Vue项目中应用TypeScript?
  • msvcp140.dll丢失是什么意思?找不到msvcp140.dll哪个解决方法简单
  • 【webrtc】neteq测试工程
  • 《剑指offer》分解让复杂问题更简单
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Kibana配置logstash,报表一体化
  • Making An Indicator With Pure CSS
  • Nacos系列:Nacos的Java SDK使用
  • PAT A1092
  • Promise面试题2实现异步串行执行
  • uva 10370 Above Average
  • 大整数乘法-表格法
  • 仿天猫超市收藏抛物线动画工具库
  • 蓝海存储开关机注意事项总结
  • 写给高年级小学生看的《Bash 指南》
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • (+4)2.2UML建模图
  • (4.10~4.16)
  • (zhuan) 一些RL的文献(及笔记)
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十六)一篇文章学会Java的常用API
  • (五)MySQL的备份及恢复
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET DataGridView数据绑定说明
  • .Net FrameWork总结
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 代码性能 - (1)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /proc/vmstat 详解
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @Validated和@Valid校验参数区别
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [1525]字符统计2 (哈希)SDUT
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [20190416]完善shared latch测试脚本2.txt
  • [AIGC] Redis基础命令集详细介绍
  • [C语言]——C语言常见概念(1)
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态