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

NumPy数据分析基础:NumPy特性以及Python内置数据结构对比详解

目录

前言

一、Numpy与Python内置结构区别

二、操作性能对比

三、底层架构

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢



前言

作为数据分析三巨头Pandas、matplotlib、NumPy之一,必然要给足面子单独拿出来讲解一波。NumPy应用场景十分宽泛,Pandas很多函数转换后也都是NumPy数组类型的数据结构。在机器学习、深度学习以及一些数据处理操作中使用的频率甚至比Pandas都高。而且NumPy功能强大,使用起来也十分便捷,支持多种复杂操作。平时我的Pandas以及一些机器学习的文章都有用到NumPy,但是博客内容并没有详细解答NumPy的操作也没有记录有关NumPy操作的一些具体函数解答。对于我这种追求一站式服务需求的博主来说着实有点不妥,故把旧坑补上,出一期全新的一文速学系列-Numpy数据分析基础专栏。

此系列文章将被纳入我的专栏一文速学系列-NumPy数据分析基础,基本覆盖到使用NumPy数据分析日常业务以及常规的数学建模分析以及复杂操作方方面面的问题。从基础的数组操作逐步入门到处理矩阵矢量特征等复杂操作,以及专业的NumPy常用函数讲解,我都将花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发、数学建模、Python工程的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。


一、Numpy与Python内置结构区别

一个用python实现的科学计算,包括:

1、一个强大的N维数组对象Array;

2、比较成熟的函数库;

3、用于整合C/C++和Fortran代码的工具包;

4、实用的线性代数、傅里叶变换和随机数生成函数。

Numpy和稀疏矩阵运算包scipy配合使用更加方便,配合Pandas数据分析更加全面。NumPy是Python中科学计算的基本包。它是一个Python库,提供多维数组对象、各种派生对象(如掩码数组和矩阵),以及对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计操作、随机模拟等。

NumPy包的核心是ndarray对象。这封装了同构数据类型的n维数组,为了提高性能,许多操作都在编译的代码中执行。NumPy数组和标准Python序列之间有几个重要区别:

  • 与Python列表(可以动态增长)不同,NumPy数组在创建时具有固定大小。更改标准阵列的大小将创建一个新阵列并删除原始阵列。
  • NumPy数组中的元素都需要具有相同的数据类型,因此内存大小相同。例外情况是:可以有(Python,包括NumPy)对象的数组,从而允许不同大小的元素的数组。
  • NumPy数组便于对大量数据进行高级数学和其他类型的操作。通常,与使用Python的内置序列相比,此类操作的执行效率更高,代码更少。
  • 越来越多的基于Python的科学和数学软件包正在使用NumPy数组;虽然它们通常支持Python序列输入,但它们在处理之前将此类输入转换为NumPy数组,并且通常输出NumPy数组。换句话说,为了有效地使用当今许多(甚至大多数)基于Python的科学/数学软件,仅仅知道如何使用Python的内置序列类型是不够的,还需要知道如何使用NumPy数组。

二、操作性能对比

序列大小和速度在科学计算中尤为重要。作为一个简单的例子,考虑将一维序列中的每个元素与另一个长度相同的序列中的相应元素相乘的情况。如果数据存储在两个Python列表a和b中,我们可以迭代每个元素:

a=[1,2,3,4]
b=[5,6,7,8]
c = []
for i in range(len(a)):
    c.append(a[i]*b[i])

但如果a和b都包含数百万个数字,Python中循环远远没有C言语高效。可以用C语言通过编写来更快地完成相同的任务(为了清晰起见,忽略了变量声明和初始化、内存分配等):

for (i = 0; i < rows; i++) {
  c[i] = a[i]*b[i];
}

 但是存在多维数组的情况就十分的复杂了,尤其是多维数组中再进行聚合操作,将大大增加了代码的复杂度和时间复杂度。

for (i = 0; i < rows; i++) {
  for (j = 0; j < columns; j++) {
    c[i][j] = a[i][j]*b[i][j];
  }
}

但是NumPy基于以上两种方式的优化,它底层代码是由C语言编写,而且使用方法极其简单:当涉及到ndarray时,逐元素操作是“默认模式”,但逐元素操作由预编译的C代码快速执行:

import numpy as np
a=np.array([1,2,3,4])
b=np.array([5,6,7,8])
c=a*b

 以接近C的速度执行前面的示例所做的操作,并且基于Python的代码具有简单性。使用NumPy甚至更简单。最后一个例子说明了NumPy的两个特性,它们是其强大功能的基础:矢量化和广播。

三、底层架构

矢量化描述了代码中没有任何显式循环、索引等,当然,这些都是在优化、预编译的C代码中“幕后”发生的。矢量化代码有许多优点,其中包括:

  • 矢量化代码更简洁,更易于阅读
  • 更少的代码行通常意味着更少的bug
  • 代码更接近于标准的数学符号(通常更容易正确编码数学结构)
  • 矢量化会产生更多的“Pythonic”代码。如果没有矢量化,我们的代码将充斥着低效和难以阅读的循环。

广播是用于描述操作的隐式元素逐个元素行为的术语;一般来说,在NumPy中,所有操作,不仅是算术操作,而且是逻辑、位、函数等,都以这种隐式的逐元素方式表现,即它们广播。此外,在上面的示例中,a和b可以是相同形状的多维数组,或者是一个标量和一个数组,甚至是具有不同形状的两个数组,前提是较小的数组可以“扩展”为较大的数组的形状,从而使生成的广播明确无误。有关广播的详细“规则”,请参见:

Broadcasting — NumPy v1.24.dev0 Manual
 

NumPy完全支持面向对象的方法,再次从ndarray开始。例如,ndarray是一个类,拥有许多方法和属性。它的许多方法都是由最外层的NumPy名称空间中的函数镜像的,允许程序员以他们喜欢的任何范式进行编码。这种灵活性使NumPy数组方言和NumPy-ndarray类成为Python中使用的多维数据交换的事实语言。

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见


相关文章:

  • (附源码)ssm学生管理系统 毕业设计 141543
  • Java8的新特性
  • Oracle-RAC集群不同节点数据查询不一致
  • 【017】基于vue.js的网易云web端(实现播放、登录)(Node接口实现)
  • 界面控件DevExpress WPF即将发布Windows 11深色主题,期待吗?
  • 【JAVA程序设计】基于SSM(非maven)图书馆座位预约管理系统
  • 基于多尺度卷积神经网络特征融合的植株叶片检测技术
  • 我的大学期末网页作业 仿学校网站制作实现 HTML+CSS西北大学新闻网带psd带js
  • vue基于web的化妆品美妆商城电子商务python flask django
  • 2022.9.29
  • 说个好事!
  • 拥有近红外染料的 花青素Cy7-四嗪, Cy7 tetrazine,CY7-四嗪 物理数据
  • 从0到1项目搭建-框架搭建(附源码)
  • Windows 11 Insider Preview Build 22621.730/22623.730(KB5017385)发布!
  • 当图网络遇上计算机视觉!计算机视觉中基于图神经网络和图Transformer的方法和最新进展...
  • Android单元测试 - 几个重要问题
  • create-react-app项目添加less配置
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6系统学习----从Apollo Client看解构赋值
  • es6要点
  • HTML-表单
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • magento 货币换算
  • node学习系列之简单文件上传
  • Redis 中的布隆过滤器
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SQLServer之索引简介
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 基于webpack 的 vue 多页架构
  • 聊一聊前端的监控
  • 入手阿里云新服务器的部署NODE
  • 小程序button引导用户授权
  • 一文看透浏览器架构
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • - 转 Ext2.0 form使用实例
  • 【云吞铺子】性能抖动剖析(二)
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​Java并发新构件之Exchanger
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #AngularJS#$sce.trustAsResourceUrl
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)visual stdio 书签功能介绍
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6 webapi log4net完整配置使用流程
  • .NET连接数据库方式