草庐IT

【知识点】np.where()用法

Rachel MuZy 2023-12-23 原文

目录

一、基本知识

二、具体实例

1.np.where(condition,x,y)

(1)示例1:

(2)示例2:

(3)示例3:

2. np.where(condition)

总结


一、基本知识

np.where 函数是三元表达式 x if condition else y 的向量化版本,它有两种用法:

1.np.where(condition,x,y) 当where内有三个参数时,第一个参数表示条件,当条件成立时where方法返回x,当条件不成立时where返回y

2.np.where(condition) 当where内只有一个参数时,那个参数表示条件,当条件成立时,where返回的是每个符合condition条件元素的坐标,返回的是以元组的形式


二、具体实例

1.np.where(condition,x,y)

(1)示例1:

有两个数值数组和一个布尔数组。当布尔数组为True 时,输出 xarr 的值,否则输出 yarr 的值

代码:

import numpy as np

xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
carr = np.array([True, False, True, True, False])

result = np.where(carr, xarr, yarr)
print(result)

结果:

[1.1 2.2 1.3 1.4 2.5]

(2)示例2:

np.where的第二个和第三个参数不需要是数组,也可以是标量。where在数据分析中的一个典型用法是根据一个数组来生成一个新的数组。

假设有一个随机生成的矩阵数据,并且想将其中的正值都替换为2,负值都替换为-2

代码:

import numpy as np

arr = np.random.randn(4, 4)
print(f'arr is {arr}')

brr = np.where(arr > 0, 2, -2)
print(f'brr is {brr}')

结果:

arr is [[ 0.25269699  0.65883562 -0.25147374 -1.39408775]
 [-0.53498966 -0.97424514 -1.13900344  0.53646289]
 [ 1.51928884  0.80805854 -0.82968494  0.82861136]
 [ 0.09549692  0.59623201  0.50521756  1.648034  ]]
brr is [[ 2  2 -2 -2]
 [-2 -2 -2  2]
 [ 2  2 -2  2]
 [ 2  2  2  2]]

(3)示例3:

也可以使用np.where 将标量和数组联合:

仅替换正值为2:

代码:

import numpy as np

arr = np.random.randn(4, 4)
print(f'arr is {arr}')

brr = np.where(arr > 0, 2, arr)
print(f'brr is {brr}')

结果:

arr is [[ 0.30064659 -0.5195743   0.05916467  0.58790562]
 [ 1.0921678  -0.30010407 -0.43318393  0.60455133]
 [-0.35091718  0.01738908 -0.3067928  -0.0439254 ]
 [ 0.59166385  1.04319898 -0.73044529  0.10357739]]
brr is [[ 2.         -0.5195743   2.          2.        ]
 [ 2.         -0.30010407 -0.43318393  2.        ]
 [-0.35091718  2.         -0.3067928  -0.0439254 ]
 [ 2.          2.         -0.73044529  2.        ]]


2. np.where(condition)

返回的是坐标

示例:

import numpy as np

a = np.array([2, 4, 6, 8, 10])
#一维矩阵
result_1 = np.where(a > 5)
print(result_1)

b = np.random.randn(4, 4)
#二维矩阵
print(b)
result_2 = np.where(b > 0)
print(result_2)

结果:

Output from spyder call 'get_namespace_view':
(array([2, 3, 4], dtype=int64),)
[[-0.83362412 -2.23605027  0.15374728  0.70877121]
 [-0.30212209  0.56606258  0.95593288  1.03250978]
 [-0.85764257  1.48541971  0.73199465  1.66331547]
 [-0.22020036  0.46416537 -0.75622715  0.32649036]]
(array([0, 0, 1, 1, 1, 2, 2, 2, 3, 3], dtype=int64), array([2, 3, 1, 2, 3, 1, 2, 3, 1, 3], dtype=int64))


总结

传递给np.where 的参数既可以是同等大小的数组,也可以是标量。当不传递参数,只传递条件时,输出的是满足条件的坐标。

有关【知识点】np.where()用法的更多相关文章

  1. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  2. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  3. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

  4. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  5. ruby-on-rails - Ruby 数组等效于 active record.where(criteria) - 2

    这可能是一段很长的时间,但如果存在的话会让生活变得更轻松一些。无论如何,这都是场景。我有一个散列数组,其中一个键的值是另一个散列.......是的,我知道。这里有一个更好的解释:@myArrayOfStuff[0]@myArrayOfStuff[0]["single-key"]@myArrayOfStuff[0]["single-key"]["object-identifier"]第一个返回一个散列。第二个将返回一个对象(在我的例子中称为页面,但示例使用不同的名称)第三个返回我作为对象标识符引用的任何变量。足够简单。我想做的是选择另一个对象标识符值不为零或大于x的数组。类似于activ

  6. ruby - 使用法拉第上传文件 - 2

    我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>

  7. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  8. 【ChatGPT】ChatGPT 的 N 种用法 - 2

    目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans

  9. ruby-on-rails - 每当 gem : I set :output but the logfile doesn't show up where I'd expect it to - 2

    在我的schedule.rb文件中,我有以下几行:set:output,'/log/cron_log.log'every5.minutesdocommand'echo"hello"'end我按照这个问题Rails,usingwhenevergemindevelopment中的建议运行了whenever-w,并且我假设cronfile已编写并正在运行。(我也尝试重新启动Rails服务器。)当我运行$crontab-l时,我看到以下内容:0,5,10,15,20,25,30,35,40,45,50,55****/bin/bash-l-c'echo"hello">>/log/cron_log

  10. ruby - 是否有 Rack::Session::Cookie 用法的基本示例? - 2

    我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=

随机推荐