NumPy where 教程(带示例)

2023-10-16

The numpy.where函数用于检索 ndarray 中给定条件为 true 的元素的索引。

学完本教程后,您将充分了解如何使用numpy.where查询NumPy 数组.

 

 

语法和参数

The numpy.where函数允许您对 NumPy 数组执行复杂的查询。
这是基本语法:


numpy.where(condition[, x, y])
  
  • condition:该参数是一个包含布尔值的数组。它定义了必须满足的条件。
    您可以使用比较运算符来定义给定数组的条件。
  • x, y:这些是可选参数。如果提供的话,numpy.where返回从中选择的元素x or y视情况而定。
    如果未提供这些参数,该函数将返回条件为 true 的索引。

让我们通过一个例子来探索语法:


import numpy as np
array = np.array([10, 20, 30, 40])
condition = array > 25
result = np.where(condition)
print(result)
  

Output:


(array([2, 3], dtype=int64),)
  

在此示例中,我们定义了一个条件数组 > 25。

The numpy.where函数检查数组中每个元素的此条件,并返回一个包含满足条件的元素索引的元组。

元素 30 和 40 满足条件,并返回它们的索引(2 和 3)。

可选参数 x 和 y 提供对输出的进一步控制。

 

使用 x 和 y 参数替换值

The x and y参数在numpy.where为函数的行为提供额外的灵活性。当提供这些参数时,该函数返回值x and y基于条件,而不是返回索引。
下面是一个例子来演示使用x and y:


import numpy as np
array = np.array([5, 15, 25, 35])
result = np.where(array > 20, 'High', 'Low')
print(result)
  

Output:


['Low' 'Low' 'High' 'High']
  

在此示例中,x 和 y 参数分别设置为 High 和 Low。条件是数组 > 20。

当条件满足时(对于元素 25 和 35),返回 High 值。

如果不满足条件(对于元素 5 和 15),则返回值 Low。

Using numpy.where,我们用字符串“Low”替换所有不匹配的数字,用字符串“High”替换所有匹配的数字。

 

返回值

您可以返回满足的值numpy.where查询而不是像这样返回索引:


import numpy as np
array = np.array([25, 15, 35, 10, 40])
filtered_indices = np.where(array > 20)
filtered_values = array[filtered_indices]
print("Filtered indices:", filtered_indices)
print("Filtered values:", filtered_values)
  

Output:


Filtered indices: (array([0, 2, 4]),)
Filtered values: [25 35 40]
  

在这个例子中,我们首先使用numpy.where查找条件数组 > 20 为 true 的索引。然后,我们使用这些索引从原始数组中提取相应的值。

结果是一个仅包含满足条件的值的新数组。

 

在多个条件下使用 where

这是一个演示如何使用的示例numpy.where具有多个条件:


import numpy as np
array = np.array([5, 15, 25, 35, 45])
condition = (array > 20) & (array < 40)
result = np.where(condition, 'Match', 'No Match')
print(result)
  

Output:


['No Match' 'No Match' 'Match' 'Match' 'No Match']
  

在此示例中,我们使用逻辑 AND 运算符 & 来组合两个条件:array > 20 和 array

The numpy.where函数对于同时满足条件(25 和 35)的元素返回 Match,对于不满足条件的元素返回 No Match。

 

将where与逻辑运算相结合

numpy.where可以与逻辑运算结合起来在数组上创建复杂的查询。

通过使用逻辑运算符,例如& (and), |(或),以及~(不是),可以组合多个条件。
这是一个演示组合的示例numpy.where与逻辑运算:


import numpy as np
array = np.array([10, 20, 30, 40, 50])
result = np.where((array > 15) & (array < 45) | (array == 10), 'Selected', 'Not Selected')
print(result)
  

Output:


['Selected' 'Selected' 'Selected' 'Selected' 'Not Selected']
  

在此示例中,我们组合了三个条件:

1. (array > 15):选择大于15的元素。
2. (array 3. (array == 10):选择等于10的元素。

我们使用了&运算符组合前两个条件和|运算符包括第三个条件。

结果是一个数组,将除最后一个 (50) 之外的所有元素标记为'Selected'.

 

将 where 与数学函数结合使用

The numpy.where函数可以与数学函数结合以根据条件执行计算。

这允许您根据是否满足条件对元素应用不同的数学转换。
这是一个例子:


import numpy as np
array = np.array([1, 2, 3, 4, 5])
result = np.where(array > 3, np.square(array), np.sqrt(array))
print(result)
  

Output:


[1.         1.41421356 1.73205081 16.         25.        ]
  

在此示例中,numpy.where 函数根据条件数组 > 3 应用两个不同的数学函数:

如果条件为 true,则应用 np.square 函数,对值进行平方。

如果条件为假,则应用 np.sqrt 函数,取值的平方根。

对于元素 1、2 和 3(条件为假),计算平方根。

对于元素 4 和 5(条件为真),计算平方。

 

嵌套 where 函数

The numpy.where函数可以嵌套在其自身内以创建条件链,从而可以对输出进行更精细的控制。

当您想要应用多个级别的条件时,这非常有用。
这是一个嵌套的例子numpy.where功能:


import numpy as np
array = np.array([5, 15, 25, 35, 45])
result = np.where(array < 20, 'Low', np.where(array < 40, 'Medium', 'High'))
print(result)
  

Output:


['Low' 'Low' 'Medium' 'Medium' 'High']
  

在这个例子中,我们使用了两个嵌套的numpy.where函数将元素分为三组。

首先numpy.where函数检查元素是否小于 20。如果为 true,则返回 Low。

如果为 false,则调用第二个numpy.where函数,进一步将元素分类为“中”或“高”。

 

与原生 Python 的性能比较

这是使用两者的基准测试numpy.where以及原生 Python 方法:


import numpy as np
import time
array = np.random.randint(0, 100, size=100000000)

# Using numpy.where
start_time = time.time()
result_np = np.where(array > 50, 'Greater', 'Smaller')
end_time = time.time()
print("Using numpy.where:", end_time - start_time)

# Using native Python
start_time = time.time()
result_python = ['Greater' if x > 50 else 'Smaller' for x in array]
end_time = time.time()
print("Using native Python:", end_time - start_time)
  

Output:


Using numpy.where: 1.0875394344329834
Using native Python: 10.121704816818237
  

在此比较中,我们使用以下方法测量了执行相同操作所需的时间numpy.where以及原生的 Python 列表理解。

The numpy.where速度明显更快,因为它利用了底层 C 实现并避免了 Python 的循环开销。

 

向量化运算 where

向量化操作是指立即将函数或操作应用于整个数组,而不是逐个元素地迭代它。

numpy.where支持向量化操作,使其能够高效地进行大规模数据操作。
这是一个演示矢量化操作的示例numpy.where:


import numpy as np
array1 = np.array([1, 2, 3, 4, 5])
array2 = np.array([5, 4, 3, 2, 1])
condition = array1 > array2
result = np.where(condition, array1 + array2, array1 - array2)
print(result)
  

Output:


[-4 -2  6  6 10]
  

在此示例中,我们创建了两个 NumPy 数组和一个比较它们对应元素的条件。

Using numpy.where,我们根据条件应用了两种不同的向量化操作:

如果条件为真,则将 array1 和 array2 的相应元素相加。

如果条件为假,则将 array1 和 array2 的相应元素相减。

由于条件仅适用于第三个、第四个和第五个元素,因此将它们相加,而将其余元素相减。

 

使用 where 进行广播(处理不同的形状)

NumPy 中的广播是指能够对不同形状和大小的数组执行操作,并将其自动广播为通用形状。

这是一个例子:


import numpy as np
array = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
condition = np.array([True, False, True])
result = np.where(condition, array, -array)
print(result)
  

Output:


[[ 1 -2 3]
[ 4 -5 6]
[ 7 -8 9]]
  

在此示例中,条件数组的形状为 (3,),而数组的形状为 (3, 3)。

The numpy.where函数广播条件以匹配数组的形状。

对于第一列和第三列(条件为真),保留原始值。

对于第二列(条件为假),值被否定。

 

资源

https://numpy.org/doc/stable/reference/ generated/numpy.where.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NumPy where 教程(带示例) 的相关文章

  • 需要根据数据框中的行号应用不同的公式

    我正在努力在数据框中找到某种移动平均值 该公式将根据正在计算的行数而变化 实际场景是我需要计算Z列 Edit 2 以下是我正在使用的实际数据 Date Open High Low Close 0 01 01 2018 1763 95 176
  • 按每个元素中出现的数字对字符串列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个脚本 其目的是对不断下载到服务器上的空间数据集文件进行排序和处理 我的列表目前大致如下 list file t00Z wrff02 grib2 file t00Z wrff03 grib2 file t0
  • 有什么好的适用于 Google App Engine 应用程序的 AJAX 框架吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Google App Engine 应用程序中实现 AJAX 因此我正在寻找一个好的
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • DataFrame.loc 的“索引器太多”

    我读了关于切片器的文档 http pandas pydata org pandas docs stable advanced html using slicers一百万次 但我从来没有理解过它 所以我仍在试图弄清楚如何使用loc切片Data
  • 在多核上运行 python 线程

    我知道Python 2 7不允许在不同的内核上运行多个线程 你需要使用multiprocessing模块以实现某种程度的并发性 我正在看concurrent futuresPython 3 4 中的模块 是否使用ThreadPoolExec
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • matplotlib vlines 图中未应用 y 轴的最小值

    我正在 matplotlib 中绘制 vlines 图 数据集中的所有 y 值如下 gt 0 我希望 y 轴最底部的刻度能够读取0 但相反 我得到 500 这是代码 usr bin env python import numpy as np
  • ImproperlyConfigured at / 不允许空静态前缀 - Django

    我正在使用 Django 上传 显示图像 该网站部署在 Heroku 上 下列的this https coderwall com p bz0sng教程我能够成功上传图像 但是 图像并未显示在模板中 然后我了解到我的 urls py 末尾应该
  • 类变量:“类列表”与“类布尔值”[重复]

    这个问题在这里已经有答案了 我不明白以下示例的区别 一次类的实例可以更改另一个实例的类变量 而另一次则不能 示例1 class MyClass object mylist def add self self mylist append 1
  • 机器学习的周期性数据(例如度角 -> 179 与 -179 相差 2)

    我使用 Python 进行核密度估计 并使用高斯混合模型对多维数据样本的可能性进行排名 每一条数据都是一个角度 我不确定如何处理机器学习的角度数据的周期性 首先 我通过添加 360 来删除所有负角 因此所有负角都变成了正角 179 变成了
  • Kivy TextInput 水平和垂直对齐(文本居中)

    如何在 Kivy 的 TextInput 中水平居中文本 I have the following screen But I want to centralize my text like this 这是我的 kv 语言的一部分 BoxLa
  • “KMeans”对象没有属性“k”

    我使用 Yellowbrick 包绘制数据集的肘部曲线 以使用 KMeans 作为模型找到数据集的最佳簇数 我正在使用 Scikit learn KMeans 和 Yellowbrick kelbowvisualizer 函数 生成了肘部曲
  • 在python中使用编解码器utf-8打开文件错误

    我在 windows xp 和 python 2 6 4 上执行以下代码 但它显示 IOError 如何打开名称带有 utf 8 编解码器的文件 gt gt gt open unicode txt euc kr encode utf 8 T
  • Python GTK3 Treeview 向上或向下移动选择

    如何在树视图中向上或向下移动所选内容 我的想法是 我可以使用向上和向下按钮将选择向上移动一行或向下移动一行 我的 Treeview 使用 ListStore 不确定这是否重要 首先 我将使用我熟悉的 C 代码 如果您在将其翻译为 Pytho
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • python 中的 F 字符串前缀给出语法错误[重复]

    这个问题在这里已经有答案了 我有一个名为 method 的变量 它的值是 POST 但是当我尝试运行时print f method method is used 它不断在最后一个双引号处给出语法错误 我找不到它这样做的原因 我正在使用 py
  • 如何使用 python 模块的多个 git 分支?

    我想使用 git 来同时处理我正在编写的模块中的多个功能 我目前正在使用 SVN 只有一个工作区 因此我的 PYTHONPATH 上只有该工作区 我意识到这不太理想 所以我想知道是否有人可以建议一种更 正确 的方法来做到这一点 让我用一个假
  • 尝试 numba 时出现巨大错误

    我在使用 numba 时遇到了大量错误 讽刺的是 正确的结果是在错误之后打印的 我正在使用最新的 Anaconda python 并安装了 numba conda install numba 一次在 Ubuntu 13 64 位和 anac
  • 在Python中使用os.makedirs创建目录时出现权限问题

    我只是想处理上传的文件并将其写入工作目录中 该目录的名称是系统时间戳 问题是我想以完全权限创建该目录 777 但我不能 使用以下代码创建的目录755权限 def handle uploaded file upfile cTimeStamp

随机推荐

  • 如何在 Ubuntu 18.04 和 16.04 上配置 NFS 共享

    网络文件系统 NFS 是一个分布式文件系统协议 它允许客户端计算机上的用户以类似于访问本地存储的方式通过网络访问文件 本文将帮助您在 Ubuntu 系统上安装和配置 NFS 并导出目录并将其挂载到客户端系统上 网络详情 我们在同一网络 19
  • 让 Shell 访问正在运行的 Docker 容器:实用指南

    Docker 是容器化事实上的标准 提供了一种打包和分发应用程序的有效方法 作为开发人员或系统管理员 有时您可能需要获得对正在运行的 Docker 容器的 shell 访问权限 这可以用于调试目的 应用程序管理或其他各种任务 本指南提供了有
  • 如何在 Git 存储库中创建分支

    Git 是一个强大的版本控制系统 被软件开发人员广泛使用 Git 的关键功能之一是能够在单个存储库中创建和管理多个分支 在本文中 我们将分步讲解创建 Git 分支的过程 第 1 步 了解 Git 分支 在我们深入创建 Git 分支之前 了解
  • 如何在 Bash Shell 脚本中使用函数

    什么是功能 函数也可以称为子例程 过程是用于特定任务的代码块 函数还有一个属性 称为可重用性 本教程将帮助您了解如何在 shell 脚本中创建和使用函数 在 Shell 脚本中创建第一个函数 在 shell 脚本中创建第一个函数 显示输出
  • 如何在 Git 中列出远程分支

    Git 是一种流行的版本控制系统 开发人员使用它来跟踪对其代码所做的更改 分支是 Git 的一个重要方面 因为它们允许开发人员并行处理多个功能或修复错误 而不会影响主代码库 在 Git 中 您可以创建两种类型的分支 本地分支和远程分支 本地
  • 如何在 MacOS 上安装 VirtualBox

    如何在 macOS 上安装 VirtualBox 在 macOS 系统上安装 VirtualBox 以及扩展包的分步教程 VirtualBox 是一款流行的跨平台虚拟机管理器 可让您在 Mac 上创建虚拟机 VM VM可用于同时运行不同的操
  • 如何在 Ubuntu 18.04 上安装 Anaconda

    Anaconda 是最流行的 Python 数据科学和机器学习平台 用于大规模数据处理 预测分析和科学计算 Anaconda 发行版附带了 1 000 多个数据包 conda命令行工具和名为 Anaconda Navigator 的桌面图形
  • 如何检查Python版本

    Python 是世界上最流行的编程语言之一 它用于开发网站 编写脚本 机器学习 分析数据等 本文介绍如何使用命令行检查操作系统上安装的 Python 版本 这在安装需要特定版本 Python 的应用程序时非常有用 我们还将向您展示如何以编程
  • 如何在 Ubuntu 18.04 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 在虚拟机上运行 Ubuntu 时 不存在交换分区 唯一的
  • Linux 中的终止命令

    Linux是一个伟大而先进的操作系统 但它并不完美 有时 某些应用程序可能会开始表现不稳定并变得无响应或开始消耗大量系统资源 无响应的应用程序无法重新启动 因为原始应用程序进程永远不会完全关闭 唯一的解决方案是重新启动系统或终止应用程序进程
  • 如何更改 Linux 中的 Swappiness 值

    交换空间是 RAM 内存已满时使用的硬盘的一部分 交换空间可以是专用交换分区或交换文件 当 Linux 系统耗尽物理内存时 非活动页面将从 RAM 移至交换空间 Swappiness 是一个 Linux 内核属性 它设置将页面从物理内存换出
  • 如何在 Python 中查找列表的长度

    列表是Python中最常用的数据类型之一 用于存储相同类型的项目的集合 本文介绍如何查找列表的长度 len 功能 Python有一个内置函数len 返回给定对象的长度 该对象可以是一个list 元组 字符串 字典等 的语法len 函数如下
  • Tmux 入门

    本指南将介绍 Tmux 的安装和基本用法 以帮助您入门和运行 什么是 tmux Tmux 是终端多路复用器的替代品GNU 屏幕 换句话说 这意味着您可以启动 Tmux 会话 然后在该会话中打开多个窗口 每个窗口占据整个屏幕 并且可以分割成矩
  • 如何在 Python 中向列表添加元素(追加、扩展和插入)

    在 Python 中使用列表时 您经常需要向列表中添加新元素 Python 列表数据类型具有三种添加元素的方法 append 将单个元素追加到列表中 extend 将可迭代的元素追加到列表中 insert 在列表的给定位置插入单个项目 所有
  • 如何添加 Git 远程

    通常 在使用 Git 时 您将仅使用一个名为 origin 的远程服务器 并针对不同的功能和环境使用不同的分支 Origin 是克隆存储库时自动创建的远程名称 并指向克隆的存储库 然而 当与一群人协作处理一个项目时 您可能会发现使用多个 G
  • Linux 中的 Dig 命令(DNS 查找)

    Dig Domain Information Groper 是一个强大的命令行工具 用于查询 DNS 名称服务器 The dig命令 允许您查询有关各种 DNS 记录的信息 包括主机地址 邮件交换和名称服务器 由于其灵活性和易用性 它是系统
  • 如何在 Ubuntu 20.04 上安装 Zoom

    Zoom是一个易于使用的通信平台 集云视频会议 实时消息传递和内容共享于一体 使用 Zoom 您可以举办网络研讨会 组织在线会议以及创建会议室 本指南介绍如何在 Ubuntu 20 04 上安装 Zoom 相同的说明适用于所有基于 Debi
  • 如何在 Ubuntu 20.04 上安装 Memcached

    Memcached 是一个免费开源的高性能内存键值数据存储 它通常用于通过缓存 API 和数据库调用结果中的各种对象来加速应用程序 本文介绍如何在 Ubuntu 20 04 上安装和配置 Memcached 安装 Memcached mem
  • PyQt5绘图教程(绘画API)

    在本教程中 我们将学习如何绘制矢量图形PyQt5 正如您将看到的 在 Python 中 PyQt5 模块是可用于绘图目的的最简单的模块 在开始之前 让我们使用 PyQt5 创建一个窗口 在其中绘制图形 目录 hide 1 创建一个 PyQt
  • NumPy where 教程(带示例)

    The numpy where函数用于检索 ndarray 中给定条件为 true 的元素的索引 学完本教程后 您将充分了解如何使用numpy where查询NumPy 数组 目录 hide 1 语法和参数 2 使用 x 和 y 参数替换值