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

Python Numpy基础教程

本文是一个关于Python numpy的基础学习教程,其中,Python版本为Python 3.x

什么是Numpy

Numpy = Numerical + Python,它是Python中科学计算的核心库,可以高效的处理多维数组的计算。并且,因为它的许多底层函数是用C语言编写的,所以运算速度敲快。

基础知识

ndarray

NumPy的主要对象是同类型的多维数组ndarray。它是一个通用的同构数据多维容器,所有的元素必须是相同类型的,并通过正整数元组索引。利用该对象可以对整块数据执行一些数学运算,语法和标量元素之间的运算一样。在NumPy中,维度称为轴,轴的数目为rank。

介绍一下ndarray常用的属性:

  1. ndarray.shape:表示各个维度中数组的大小,是一个整数的元组
  2. ndarray.dtype:描述数组中元素类型的对象
  3. ndarray.ndim:数组中轴的个数
  4. ndarray.size:数组元素的总数
  5. ndarray.itemsize:数组中每个元素的字节大小

创建数组

创建数组通常有5种方式:

1. 由Python结构(list, tuple等)转换

创建数组最简单的办法就是使用array对象,它可以接受任何序列型的对象,然后产生一个新的含有传入数据的numpy数组(ndarray)。
举个最简单的例子:

import numpy as npa = np.array([1, 2, 3])
print(a)
print(a.dtype)
print(a.shape)

2. 使用Numpy原生数组创建(arange, ones,zeros等)

如:

b = np.zeros(10)
c = np.ones((1, 2))

3. 从磁盘读取数组

使用np.load方法读取数据。

4. 使用字符串或缓冲区从原始字节创建数组

5. 使用特殊库函数(random等)

索引和切片

基础操作

一维数组中的索引表面看起来和Python list的功能差不多。

对于切片而言,当你将一个标量值赋值给一个切片时,该值会自动传播到整个选区,跟Python list最重要的区别在于:Numpy中数组的切片作用的是原始数据的视图,也就是数据没有被复制,所有的修改都会直接作用到源数据。这是因为,Numpy设计之初就是为了处理大数据,将数据复制来复制去自然会产生很多性能问题。如果你想要得到一份数据副本,就需要显式的使用.copy()方法。

举个例子:

arr = np.arange(10)
print(arr)
print(arr[0])
print(arr[1:6])
arr_slice = arr[1:6]
arr_slice[1:3] = 5
print(arr_slice)
print(arr)
arr_copy = arr[1:6].copy()
arr_copy[1:3] = 6
print(arr_copy)
print(arr)

对于多维数组,各索引位置上的元素不再是标量,而是数组,可以传入一个以逗号隔开的索引列表来访问单个元素。其它操作和一维数组相同。

举个例子:

arr_2d = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
print(arr_2d[0])
print(arr_2d[0, 1])
arr_2d_slice = arr_2d[1]
print(arr_2d_slice)
arr_2d_slice[0] = 1
print(arr_2d_slice)
print(arr_2d)

切片索引

ndarray的切片语法和Python list类似,对于高维对象,花样比较多,可以在一个或者多个轴进行切片,也可以跟整数索引混合使用(降低维度)。

举个例子:

arr_test = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
print(arr_test[:2])
print(arr_test[:2, 1:])
print(arr_test[1, :1])
arr_slice_test = arr_test[:2, 1:]
arr_slice_test[0] = 0
print( arr_slice_test)
print(arr_test)

布尔型索引

通过布尔型索引,可以方便我们根据指定条件快速的检索数组中的元素。如果进行变量或者标定量的大数据处理,这种筛选功能的使用肯定会给程序的设计带来极大的便捷。

举个简单例子:

In [1]: import numpy as np
In [2]: x = np.array([[0, 1], [2, 3], [3, 4]])
In [3]: x
Out[3]:
array([[0, 1],[2, 3],[3, 4]])
In [4]: x > 2
Out[4]:
array([[False, False],[False,  True],[ True,  True]])
In [5]: x[ x > 2] = 0
In [6]: x
Out[6]:
array([[0, 1],[2, 0],[0, 0]])

并且,可以结合使用ndarray的统计方法来对布尔型数组中的True值进行计数,常见有三种方法:

  1. sum():对True值进行计数
  2. any():测试数组中是否存在一个或者多个True
  3. all():检查数组中的所有值是否都是True

花式索引

花式索引(Fancy indexing)是一个Numpy的术语,指的是利用整数数组进行索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

举个例子:

In [1]: import numpy as npIn [2]: array = np.empty((4, 3))In [3]: for i in range(4):...:     array[i] = i...:In [4]: array
Out[4]:
array([[0., 0., 0.],[1., 1., 1.],[2., 2., 2.],[3., 3., 3.]])In [5]: array[[1, 3]]
Out[5]:
array([[1., 1., 1.],[3., 3., 3.]])In [6]: array[[-1, -3]]
Out[6]:
array([[3., 3., 3.],[1., 1., 1.]])In [7]: array[np.ix_([3, 0],[2, 1])]
Out[7]:
array([[3., 3.],[0., 0.]])

形状操作

形状转换

介绍几个常见的修改数组形状的方法:

  1. reshape():不改变原始数据的情况下修改数组

  2. flat():一个数组元素的迭代器,可以处理数组元素中的每个数据

  3. flatten():返回一份数组拷贝,对拷贝所做的处理不会影响原始数组,格式为.flatten(order=''),其中order='C'表示按行展开,'F'表示按列,'A'表示原顺序,'K'表示元素在内存中的出现顺序。

  4. ravel():展平的数组元素,顺序通常是"C风格",返回的是数组视图,修改会影响原始数组。

    该函数接收两个参数:

举个例子:

arr = np.arange(12)
print(arr)
arr1 = arr.reshape(3, 4)for item in arr1:print(item)
for item in arr1.flat:print(item)print(arr1.flatten())
print(arr1.flatten(order="K"))
arr.flatten()[10] = 0
print(arr)print(arr.ravel())
arr.ravel()[10] = 0
print(arr)

转置与轴对换

介绍常见的几种方法:

  1. ndarray.T:转置
  2. transpose: 对换数组的维数
  3. rollaxis: 向后滚动指定的轴
  4. swapaxes:用于交换数组的两个轴

转置是数据重塑的一种特殊形式,返回了源数据的视图。简单的转置可以使用.T,也可以使用transpose方法和swapaxes。

举个例子:

arr = np.arange(12).reshape((2, 2, 3))
print(arr)
print(arr.T)
print(arr.transpose((1, 0, 2)))
print(arr.swapaxes(1, 2))

通用函数:快速的元素级数组函数

通用函数(ufunc)是一种对ndarray中的数据执行元素级运算的函数,可将其分为一元和二元进行说明。

一元func

一元func可看做是简单的元素级变体,比如sqrt和cos,举个例子:

arr = np.arange(10)
print(np.sqrt(arr))
print(np.square(arr))

二元func

接受2个数组,然后返回一个结果数组,比如add和mod,举个例子:

arr1 = np.arange(10)
arr2 = np.arange(10)
print(np.add(arr1, arr2))

更多函数去官方文档查阅,哈哈,这里就不赘述了。

数组运算

基础运算

在Numpy中,可以利用ndarray对整块数据执行一些数学运算,语法和普通的标量元素之间的运算一样。其中,数组与标量的运算会将标量作用于各个数组元素。

举个例子:

i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])
print(i + j)
print(i - j)
print(i - 1)
print(i * j)
print( i / j)

以上,乘法并不同于矩阵乘法,若需进行矩阵相乘,可使用:

i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])print(j.dot(i))

除此之外,Numpy还提供了以下常用统计方法:

  1. min():数组最小值
  2. max():数组最大值
  3. sum():数组元素相加
  4. cumsum():计算轴向元素累加和,返回由中间结果组成的数组
  5. cumprod():所有元素的累计积

数组表达式

编写数组表达式处理多个数组数据也是很便捷高效的,举个例子:假设我们想要在一组值(网格型)上计算函数sqrt(x^2 + y^2),使用np.mashgrid函数接受两个一维数组,产生两个二维矩阵:

In [1]: import numpy as npIn [2]: points = np.arange(-5, 5, 0.01)In [3]: x, y = np.meshgrid(points, points)In [4]: x
Out[4]:
array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],...,[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])In [5]: z = np.sqrt(x ** 2 + y ** 2)In [6]: z
Out[6]:
array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,7.06400028],[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,7.05692568],[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,7.04985815],...,[7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,7.04279774],[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,7.04985815],[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,7.05692568]])

条件筛选

介绍几个常见的筛选方法:

  1. where:返回输入数组中满足给定条件的元素的索引
  2. .argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引
  3. nonzero() 函数返回输入数组中非零元素的索引。

实例

接下来,使用Numpy来模拟随机漫步操作下数组运算。

首先,实现一个很简单的1000步的随机漫步,从0开始,随机生成1和-1,判断随机漫步过程中第一次到达某个值(暂定为8)的时间(步数),实现:

import numpy as np
nsteps = 1000
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)
# 各步的累计和
walk = steps.cumsum()
# 第一次到达8的时间
walk_8 = (np.abs(walk) >= 8).argmax()
print(walk_8)

 

相关文章:

Python Numpy基础教程

本文是一个关于Python numpy的基础学习教程,其中,Python版本为Python 3.x 什么是Numpy Numpy Numerical Python,它是Python中科学计算的核心库,可以高效的处理多维数组的计算。并且,因为它的许多底层函数是用C语言编…...

常见HTTP请求错误码大全

响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。 响应码分五种类型,由它们的第一位数字表示: 1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接受、…...

重保期间如何「快速」构建内容安全治理体系?

国际会议、国家会议、大型活动、节日庆典等重要时期,往往也是国内外各类攻击组织活跃的高峰期,大量政企机构的互联网展示窗口都会成为网络攻击的重要目标。 网络攻击方式不但有常见的SQL注入攻击、DDoS攻击等破坏方式,更有开始向恶意篡改方式…...

用Qt开发的ffmpeg流媒体播放器,支持截图、录像,支持音视频播放,支持本地文件播放、网络流播放

前言 本工程qt用的版本是5.8-32位,ffmpeg用的版本是较新的5.1版本。它支持TCP或UDP方式拉取实时流,实时流我采用的是监控摄像头的RTSP流。音频播放采用的是QAudioOutput,视频经ffmpeg解码并由YUV转RGB后是在QOpenGLWidget下进行渲染显示。本…...

第七节 平台设备驱动

在之前的字符设备程序中驱动程序,我们只要调用open() 函数打开了相应的设备文件,就可以使用read()/write() 函数,通过file_operations 这个文件操作接口来进行硬件的控制。这种驱动开发方式简单直观,但是从软件设计的角度看&#…...

代理模式详解

本文首更于《从零开始手把手教你实现一个简单的RPC框架》 。 1. 代理模式2. 静态代理3. 动态代理 3.1. JDK 动态代理机制 3.1.1. 介绍3.1.2. JDK 动态代理类使用步骤3.1.3. 代码示例 3.2. CGLIB 动态代理机制 3.2.1. 介绍3.2.2. CGLIB 动态代理类使用步骤3.2.3. 代码示例 3.3. …...

根据报告20%的白领在一年内做过副业,你有做副业吗?

现在大部分人收入单一,收入都是来源于本职工作,当没有了工作就没有了收入的来源,而生活压力又很大,各种开支,各种消费。所以很多人想要增加收入来源,增加被动收入,同时通过副业提升自己的价值和…...

第二十三周周报

学习内容: 修改ViTGAN代码 学习时间: 2.3-2.10 学习产出: 现在的效果 可以看到在700k左右fid开始上升,相比vitgan,改的vitgan鉴别器loss有所下降,但是fid没有降下来,最好为23.134&#xf…...

2023年Q1业绩增长背后,迪士尼亟待扭转流媒体亏损困局

重新执掌迪士尼后,鲍勃伊格尔交出了一份表现尚可的“答卷”。 图源:迪士尼 美东时间2023年2月8日,迪士尼披露了2023财年Q1财报,营收为235.1亿美元,同比增长8%;持续经营净利润13亿美元,同比增长11%。受此利…...

LKWA靶场通关和源码分析

文章目录一、Blind RCE&#xff1f;二、XSSI三、PHP Object Injection四、PHP Object Injection(cookie)五、PHP Object Injection(Referer)六、PHAR七、SSRF八、Variables总结一、Blind RCE&#xff1f; 源码&#xff1a; <?php include("sidebar.php"); /***…...

logcpp demo

step1&#xff1a;nug下载log4cppstep2&#xff1a;实现demo#include <iostream>#include <log4cpp/Category.hh>#include <log4cpp/Appender.hh>#include <log4cpp/FileAppender.hh>#include <log4cpp/Priority.hh>#include <log4cpp/Patter…...

平价款的血糖血压监测工具,用它养成健康生活习惯,dido F50S Pro上手

之前看有数据显示国内的三高人群越来越年轻&#xff0c;很多人不到三十就有了高血压、高血糖的问题&#xff0c;埋下了不小的健康隐患&#xff0c;加上前阵子的疫情管控放松&#xff0c;人们了解到了新冠病毒对心脏负担的认知&#xff0c;预防慢病被大众提上了日程&#xff0c;…...

算法训练营 day42 动态规划 理论基础 斐波那契数 爬楼梯 使用最小花费爬楼梯

算法训练营 day42 动态规划 理论基础 斐波那契数 爬楼梯 使用最小花费爬楼梯 理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状…...

MySQL8 创建用户,设置修改密码,授权

MySQL8 创建用户,设置修改密码,授权 MySQL5.7可以 (创建用户,设置密码,授权) 一步到位 &#x1f447; GRANT ALL PRIVILEGES ON *.* TO 用户名% IDENTIFIED BY 密码 WITH GRANT OPTION&#x1f446;这样的语句在MySQL8.0中行不通, 必须 创设和授权 分步执行&#x1f447; CR…...

MySQL —— 内置函数

目录 内置函数 一、日期函数 二、字符串函数 三、数学函数 四、其他函数 内置函数 一、日期函数 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时间date(datetime)获取datetime参数的日期部分d…...

Mybatis框架(全部基础知识)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…...

pixhawk2.4.8使用调试记录—APM固件

目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查&#xff08;每一项都非常重要&#xff09;12 飞行经验四、遇到的问…...

终于进了字节,记录一下我作为一名测试员磕磕碰碰的三个月找工作经历...

我是裸辞后重新找工作的&#xff0c;从去年到今年&#xff0c;前前后后花了大概三个月&#xff0c;大大小小参加了几百场面试。不是我说&#xff0c;作为一名测试员是真的挺难的&#xff0c;不过很庆幸自己最后拿到了字节的offer&#xff0c;今天在这里做一下记录吧&#xff0c…...

基于PYTHON django四川旅游景点推荐系统

摘 要基于四川旅游景点推荐系统的设计与实现是一个专为四川旅游景点为用户打造的旅游网站。该课题基于网站比较流行的Python 语言系统架构,B/S三层结构模式&#xff0c;通过Maven项目管理工具进行Jar包版本的控制。本系统用户可以发布个人游记&#xff0c;查看景点使用户达到良…...

MySql服务多版本之间的切换

从网上总结的经验&#xff0c;然后根据自己所遇到的问题合并记录一下&#xff0c;方便日后再次需要用到 MySql服务多版本同时运行 步骤 1、如果你电脑上已经有一个mysql版本&#xff0c;例如mysql-5.7.39-winx64&#xff0c;它占据了3306端口。此时如果你想下仔另一版本&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...