Python Numpy基础教程
本文是一个关于Python numpy的基础学习教程,其中,Python版本为Python 3.x
什么是Numpy
Numpy = Numerical + Python,它是Python中科学计算的核心库,可以高效的处理多维数组的计算。并且,因为它的许多底层函数是用C语言编写的,所以运算速度敲快。
基础知识
ndarray
NumPy的主要对象是同类型的多维数组ndarray。它是一个通用的同构数据多维容器,所有的元素必须是相同类型的,并通过正整数元组索引。利用该对象可以对整块数据执行一些数学运算,语法和标量元素之间的运算一样。在NumPy中,维度称为轴,轴的数目为rank。
介绍一下ndarray常用的属性:
- ndarray.shape:表示各个维度中数组的大小,是一个整数的元组
- ndarray.dtype:描述数组中元素类型的对象
- ndarray.ndim:数组中轴的个数
- ndarray.size:数组元素的总数
- 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值进行计数,常见有三种方法:
- sum():对True值进行计数
- any():测试数组中是否存在一个或者多个True
- 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.]])
形状操作
形状转换
介绍几个常见的修改数组形状的方法:
-
reshape():不改变原始数据的情况下修改数组
-
flat():一个数组元素的迭代器,可以处理数组元素中的每个数据
-
flatten():返回一份数组拷贝,对拷贝所做的处理不会影响原始数组,格式为.flatten(order=''),其中order='C'表示按行展开,'F'表示按列,'A'表示原顺序,'K'表示元素在内存中的出现顺序。
-
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)
转置与轴对换
介绍常见的几种方法:
- ndarray.T:转置
- transpose: 对换数组的维数
- rollaxis: 向后滚动指定的轴
- 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还提供了以下常用统计方法:
- min():数组最小值
- max():数组最大值
- sum():数组元素相加
- cumsum():计算轴向元素累加和,返回由中间结果组成的数组
- 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]])
条件筛选
介绍几个常见的筛选方法:
- where:返回输入数组中满足给定条件的元素的索引
- .argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引
- 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…...
2023年Q1业绩增长背后,迪士尼亟待扭转流媒体亏损困局
重新执掌迪士尼后,鲍勃伊格尔交出了一份表现尚可的“答卷”。 图源:迪士尼 美东时间2023年2月8日,迪士尼披露了2023财年Q1财报,营收为235.1亿美元,同比增长8%;持续经营净利润13亿美元,同比增长11%。受此利…...
LKWA靶场通关和源码分析
文章目录一、Blind RCE?二、XSSI三、PHP Object Injection四、PHP Object Injection(cookie)五、PHP Object Injection(Referer)六、PHAR七、SSRF八、Variables总结一、Blind RCE? 源码: <?php include("sidebar.php"); /***…...
logcpp demo
step1:nug下载log4cppstep2:实现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上手
之前看有数据显示国内的三高人群越来越年轻,很多人不到三十就有了高血压、高血糖的问题,埋下了不小的健康隐患,加上前阵子的疫情管控放松,人们了解到了新冠病毒对心脏负担的认知,预防慢病被大众提上了日程,…...
算法训练营 day42 动态规划 理论基础 斐波那契数 爬楼梯 使用最小花费爬楼梯
算法训练营 day42 动态规划 理论基础 斐波那契数 爬楼梯 使用最小花费爬楼梯 理论基础 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状…...
MySQL8 创建用户,设置修改密码,授权
MySQL8 创建用户,设置修改密码,授权 MySQL5.7可以 (创建用户,设置密码,授权) 一步到位 👇 GRANT ALL PRIVILEGES ON *.* TO 用户名% IDENTIFIED BY 密码 WITH GRANT OPTION👆这样的语句在MySQL8.0中行不通, 必须 创设和授权 分步执行👇 CR…...
MySQL —— 内置函数
目录 内置函数 一、日期函数 二、字符串函数 三、数学函数 四、其他函数 内置函数 一、日期函数 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时间date(datetime)获取datetime参数的日期部分d…...
Mybatis框架(全部基础知识)
👌 棒棒有言:也许我一直照着别人的方向飞,可是这次,我想要用我的方式飞翔一次!人生,既要淡,又要有味。凡事不必太在意,一切随缘,缘深多聚聚,缘浅随它去。凡事…...
pixhawk2.4.8使用调试记录—APM固件
目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查(每一项都非常重要)12 飞行经验四、遇到的问…...
终于进了字节,记录一下我作为一名测试员磕磕碰碰的三个月找工作经历...
我是裸辞后重新找工作的,从去年到今年,前前后后花了大概三个月,大大小小参加了几百场面试。不是我说,作为一名测试员是真的挺难的,不过很庆幸自己最后拿到了字节的offer,今天在这里做一下记录吧,…...
基于PYTHON django四川旅游景点推荐系统
摘 要基于四川旅游景点推荐系统的设计与实现是一个专为四川旅游景点为用户打造的旅游网站。该课题基于网站比较流行的Python 语言系统架构,B/S三层结构模式,通过Maven项目管理工具进行Jar包版本的控制。本系统用户可以发布个人游记,查看景点使用户达到良…...
MySql服务多版本之间的切换
从网上总结的经验,然后根据自己所遇到的问题合并记录一下,方便日后再次需要用到 MySql服务多版本同时运行 步骤 1、如果你电脑上已经有一个mysql版本,例如mysql-5.7.39-winx64,它占据了3306端口。此时如果你想下仔另一版本&…...
嵌入式开发:通过嵌入式虚
嵌入式虚拟化为实现多核处理能力的优势提供了一种可扩展的机制。嵌入式应用中的虚拟化与其企业和桌面应用有许多共同之处。独特的嵌入式使用案例和专业的底层技术为嵌入式开发人员提供了优化性能和响应设计的新机会。在台式机、数据中心以及现在的嵌入式设计中采用多核技术可以…...
广州穗雅医院杨济安:了解症状表现 有效防治口腔黏膜下纤维化
“医生,我出现口干大半年时间,最近两月张嘴费劲,吃点辣的,嘴就刺疼刺疼的,这是怎么回事?”半年前,家住南沙的文先生走进广州穗雅医院口腔黏膜科如是说到。在科室杨济安主任的详细问诊与检查后&a…...
[数据分析] 数据指标体系搭建
在数据分析的学习过程中,我们通常会要求掌握以下两点: 1.理解数据,懂得从数据中发现业务指标(学会如何去看懂数据) 2.使用相关指标去分析数据,同时使用多个指标去分析一个问题(了解常见的指标) 当我们拿到数据(通常以Excel或者数据库方式去…...
Dubbo 源码分析 – 集群容错之 Cluster
3.2.2 FailbackClusterInvoker FailbackClusterInvoker 会在调用失败后,返回一个空结果给服务提供者。并通过定时任务对失败的调用进行重传,适合执行消息通知等操作。下面来看一下它的实现逻辑。 public class FailbackClusterInvoker<T> extend…...
Spring学习20230208-09
IOC底层原理 IOC概念 :面向对象编程中的一种设计原则,用来降低耦合度 通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象引用传递给他。可以说,依赖被注入到对象中。控制反转&…...
tomcat10部署报错WebStatFilter cannot be cast to jakarta.servlet.Filter
异常信息09-Feb-2023 23:08:49.946 严重 [main] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[DruidWebStatFilter]java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter cannot be cast to jakarta.servlet.Filterat org.ap…...
Linux修改文件时间或创建新文件:touch
每个文件在Linux下面都记录了许多的时间参数,其实是三个主要的变动时间 修改时间(modification time,mtime):当该文件的【内容数据】变更时,就会更新这个时间,内容数据是指文件的内容ÿ…...
原生微信小程序按需引入vant
vant Vant Weapp - 轻量、可靠的小程序 UI 组件库 1.npm安装 找到项目根目录 安装 # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production 2 .修改 app.json 将 app.jso…...
高性能IO模型:为什么单线程Redis能那么快?
我们通常说Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的。这也是Redis对外提供键值存储服务的主要流程。 但redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 Redis为什么用单线…...
【数据集】中国各类水文专业常用数据集合集
1 水文气象数据 1.1 中国站点尺度天然径流量估算数据集(1961~2018年) 论文: J2022-High-quality reconstruction of China’s natural streamflow-缪驰远(北京师范大学地理科学学部) 研究内容:…...
wordpress页面过期/seo优化网站词
文章目录 零、写在前面一、概念定义1、两个集合的并2、三个集合的并二、题目描述三、算法详解四、源码剖析五、推荐专栏六、习题练习零、写在前面 这是《算法零基础100讲》 专栏打卡学习的第 29 天了。如果觉得本专栏太贵无法承受,在博主主页添加博主好友,获取 付费专栏优惠券…...
什么网站做微信公众账号/网络营销课程个人总结3000字
原因:音频编码原来为AMR,ios那边貌似不支持这种音频编码 VideoAbsActivity.java 加了 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 将音频录制格式从默认…...
网站建站基础/山东服务好的seo
https://blog.csdn.net/u013938465/article/details/53507109...
教育网站建设的素材/怎样进行seo推广
所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录...
wordpress 点餐/系统优化app
由于时间的关系,我今天只能初步的跟大家讨论一下学习数据持久化和Hibernate的概念与技术的一些所需要知道的知识,在后续的文章中我还会给出如何使用Eclipse来建立和使用Hibernate技术来操作数据库。 1.数据持久化的概述 Persistent是为了解决关系型数据库…...
网站制作图片插入代码/2023第二波疫情已经到来了吗
package com.cds.test;import java.util.Arrays;import org.junit.Test;public class RegexLearner {Test/*** 需求:我有如下一个字符串:”91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”* 100* 80* 分析:* 1,将字符串切割…...