草庐IT

【numpy笔记_1】初识numpy

fakeProgramer 2023-10-16 原文

numpy和pandas是非常强大的科学计算和数据分析工具,在算法方面也有着广泛应用。

未来笔者会通过两个系列介绍numpy和pandas的基本使用,内容但求细致,算是对过往所学的总结。本篇将从numpy开始,认识下这个十分强大的科学计算模块。

安装numpy

windows:pip install numpy
其他系统,百度一下

什么是numpy?

如刚才所说,numpy是一个科学计算模块,numpy对象(称为array对象)中每个元素的数据类型都相同。使用numpy的计算十分高效,我们来看两个例子:

【例1】

定义一个包含一千万个数字的list,每个数字都加1。使用For循环和使用numpy 进行计算,来对比耗费的时间:


li = [i for i in range(10000000)]
ali = numpy.array(li)

st1 = time.time()
for index, item in enumerate(li): # enumereate()枚举方法
    li[index] = item + 1
st2 = time.time()
ali = ali + 1   # 直接对每个元素 +1
st3 = time.time()

print(f'For循环:加一后的首个元素:{li[0]},末尾元素:{li[-1]},数组长度:{len(li)},耗时:{st2-st1}秒。')
print(f'numpy:加一后的首个元素:{ali[0]},末尾元素:{ali[-1]},数组长度:{len(ali)},耗时:{st3-st2}秒。')
# 运行结果:
For循环:加一后的首个元素:1,末尾元素:10000000,数组长度:10000000,耗时:1.5949997901916504秒。
numpy:加一后的首个元素:1,末尾元素:10000000,数组长度:10000000,耗时:0.019999980926513672秒。

【例2】

对上个例子中的list进行求和操作:


li = [i for i in range(10000000)]
ali = numpy.array(li)

st1 = time.time()
res1 = sum(li)
st2 = time.time()
res2 = ali.sum(dtype=numpy.int64)   # 由于数组过大,需要指定array对象的数据类型,否则求和值超出元素的数据类型时会导致计算结果出错。
st3 = time.time()

print(f'普通求和结果:{res1},耗时:{st2-st1}秒。')
print(f'numpy求和结果:{res2},耗时:{st3-st2}秒。')
# 运行结果:
普通求和结果:49999995000000,耗时:0.24000000953674316秒。
numpy求和结果:49999995000000,耗时:0.00800013542175293秒。

可以看到,numpy处理数组的效率整体比普通的python运算快了近百倍。

但numpy的价值远不止于此。array对象基于固定的数字类型计算,其本质是由一个或多个数组组成的数字矩阵,既然是矩阵,说明array对象可以是一组或多组的数,这就是维度的概念。

创建一个numpy对象

我们通过numpy.array(object)方法创建一个array数组对象:


array_1d = numpy.array([1,3,5,7])   # array()方法创建
array_2d = numpy.array([[1,3,5,7],[2,4,6,8]])
array_3d = numpy.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
# 一维(1darray):shape = (4列)
[1 3 5 7]
# 二维(2darray):shape = (2行,4列)
    [[1 3 5 7]
    [2 4 6 8]]
# 三维(3darray):shape = (2维,2行,3列)
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

原则上,array对象的元素应是数字,但numpy同样支持创建str。
创建前python会检验元素类型,再给出能够包含所有元素的数据格式。
来看一个例子:

import numpy as np
li_1 = [1, 3]
li_2 = [1, True]   # bool同时对应int类型的1, 0
li_3 = [False, True]
li_4 = [1, 3.279]
li_5 = [1, 'hello']

list_pool = [li_1, li_2, li_3, li_4, li_5]
for i in list_pool:
    ali = np.array(i)
    print(f'数据内容:{ali},类型:{ali.dtype}')
# 运行结果:
数据内容:[1 3] ,类型:int32
数据内容:[1 1] ,类型:int32
数据内容:[False  True],类型:bool
数据内容:[1.    3.279],类型:float64
数据内容:['1' 'hello'],类型:<U11

查看array对象的一些基本属性:

array_2d = numpy.array([[1,3,5,7],[2,4,6,8]])
print(array_2d)
print(f'array_2d对象的shape:{array_2d.shape}')
print(f'array_2d对象的dtype类型:{array_2d.dtype}')
print(f'array_2d对象的维度数:{array_2d.ndim}')
# 运行结果:
[[1 3 5 7]
 [2 4 6 8]]
array_2d对象的shape:(2, 4)
array_2d对象的dtype类型:int32
array_2d对象的维度数:2

创建随机、全零、全1数组:

empty_array = numpy.empty((3,2), dtype=numpy.int32)  # 创建并非空值,而是指定数据类型的随机数字
zeros_array = numpy.zeros((3,2), dtype=numpy.int32)
ones_array = numpy.ones((3,2), dtype=numpy.int32)
print(empty_array)
print('*'*20)
print(zeros_array)
print('*'*20)
print(ones_array)
# 运算结果:
[[-1201405844        2046]
 [-1201393040        2046]
 [    5439567          69]]
********************
[[0 0]
 [0 0]
 [0 0]]
********************
[[1 1]
 [1 1]
 [1 1]]

知识补充:

上面【例2】中提到的dtype类型不对,数据运算时可能引发计算结果出错,是由于定义一个array对象时如果不指定数据类型,会根据元素值的大小(字节数)自动默认一种数据类型, 且求和的值遵守该数据类型。
如果某个array数组中存在的值相当多,和值的上限超出该数据类型的上限时,计算结果往往会出错。


ali1 = numpy.array([1,3,5,7])
ali2 = numpy.array([i for i in range(10000000)])
ali3 = numpy.array([0.3,1.00,0.0079])
print(f'ali1数据类型:{ali1.dtype}\nali2数据类型:{ali2.dtype}\nali3数据类型:{ali3.dtype}')
print(f'ali2未指定数据类型,直接求和的结果为:{ali2.sum()},和的数据类型:{type(ali2.sum())}')
# 运算结果:
ali1数据类型:int32
ali2数据类型:int32
ali3数据类型:float64
ali2未指定数据类型,直接求和的结果为:-2014260032,和的数据类型:<class 'numpy.int32'>

解决办法就是定义对象或进行求和操作时,定义一个更为合适的数字类型。


# 定义对象时指定数据类型
ali2 = numpy.array([i for i in range(1000000)], dtype=numpy.int64)
# 或,求和时制定数据类型
ali3 = numpy.array([i for i in range(1000000)])
res3 = ali3.sum(dtype=numpy.int64)

print(f'ali2求和的结果为:{ali2.sum()},和的数据类型:{ali2.sum().dtype}')
print(f'ali3求和的结果为:{res3},和的数据类型:{res3.dtype}')
# 运行结果:
ali2求和的结果为:499999500000,和的数据类型:int64
ali3求和的结果为:499999500000,和的数据类型:int64

对numpy的认识到这里就差不多了,未来会进一步学习numpy的常用操作。

附:numpy数据类型:

numpy数据类型.png

有关【numpy笔记_1】初识numpy的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  3. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  4. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  5. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

  6. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  7. 华为数通笔记VXLAN&BGP EVPN - 2

    VXLAN简介定义RFC定义了VLAN扩展方案VXLAN(VirtualeXtensibleLocalAreaNetwork,虚拟扩展局域网)。VXLAN采用MACinUDP(UserDatagramProtocol)封装方式,是NVO3(NetworkVirtualizationoverLayer3)中的一种网络虚拟化技术。目的随着网络技术的发展,云计算凭借其在系统利用率高、人力/管理成本低、灵活性/可扩展性强等方面表现出的优势,已经成为目前企业IT建设的新趋势。而服务器虚拟化作为云计算的核心技术之一,得到了越来越多的应用。服务器虚拟化技术的广泛部署,极大地增加了数据中心的计算密度;同时,为

  8. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  9. 【微服务笔记23】使用Spring Cloud微服务组件从0到1搭建一个微服务工程 - 2

    这篇文章,主要介绍如何使用SpringCloud微服务组件从0到1搭建一个微服务工程。目录一、从0到1搭建微服务工程1.1、基础环境说明(1)使用组件(2)微服务依赖1.2、搭建注册中心(1)引入依赖(2)配置文件(3)启动类1.3、搭建配置中心(1)引入依赖(2)配置文件(3)启动类1.4、搭建API网关(1)引入依赖(2)配置文件(3)启动类1.5、搭建服务提供者(1)引入依赖(2)配置文件(3)启动类1.6、搭建服务消费者(1)引入依赖(2)配置文件(3)启动类1.7、运行测试一、从0到1搭建微服务工程1.1、基础环境说明(1)使用组件这里主要是使用的SpringCloudNetflix

  10. 论文笔记:InternImage—基于可变形卷积的视觉大模型,超越ViT视觉大模型,COCO 新纪录 64.5 mAP! - 2

    目录文章信息写在前面Background&MotivationMethodDCNV2DCNV3模型架构Experiment分类检测文章信息Title:InternImage:ExploringLarge-ScaleVisionFoundationModelswithDeformableConvolutionsPaperLink:https://arxiv.org/abs/2211.05778CodeLink:https://github.com/OpenGVLab/InternImage写在前面拿到文章之后先看了一眼在ImageNet1k上的结果,确实很高,超越了同等大小下的VAN、RepLK

随机推荐