首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Numpy模块中的where函数

Numpy模块中的where函数

作者头像
触摸壹缕阳光
发布2020-04-26 15:15:46
发布2020-04-26 15:15:46
2.4K0
举报

前言

学习过编程语言的话一定知道一个称为"三目运算符"(三元表达式)的东西,一般来说我们可以把它看成是一个简单的"if-else"语句。下面是在java中的三目表达式(其实在大多数的语言中都是这样的):

代码语言:javascript
复制
单目运算符: ~3(位运算符取反码)双目运算符:3 + 4三目运算符:    格式:比较(关系)表达式?表达式1:表达式2;        比较表达式:结果是一个boolean类型。执行流程:    根据比较(关系)表达式的计算返回一个ture或者false。        如果是true,就把表达式1作为结果。        如果是false,就把表达式2作为结果。

这里为什么要提一下其它编程语言中的三目表达式呢?因为在Python没有使用这种通用格式来实现三元表达式,而是使用下面的格式来实现三元表达式:

代码语言:javascript
复制
为真时的结果 if 判定条件 else 为假时的结果

这里看看它们有什么区别?我们知道在java中"三目运算符"是对"if-else"语句的一个简化,如果能用"三目运算符"实现的一定能用"if-else"语句来实现,当然它们肯定是有区别的,由于"三目运算符"是一个运算符,所以它必须返回的是一个结果而不是输出,但是"if-else"返回的结果不仅可以是一个结果还可以是一个输出。不过在Python中虽然可以称为"三目运算符"或者"三元表达式",但是我认为在Python中仅仅能称为"三元表达式",因为此时返回的结果只能是一个输出,而且单单看Python中实现"三元表达式"语句,其实怎么看都像是"if-else"的另一种表示形式。当然这仅仅是本人的理解。

代码语言:javascript
复制
print('4') if 2 < 4 else print('2')

a numpy.where

前面说了那么多关于三元表达式,就是为了引出numpy.where函数,其实猜也能猜出来,我们的numpy.where函数正是我们的三元表达式x if condition else y的矢量化的版本。看下面的小例子:

代码语言:javascript
复制
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])
cond = np.array([True , False , True , True ,False])

result = [(x if c else y)
                    for x,y,c in zip(xarr,yarr,cond)]

print(result)

[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]

上面例子的输出结果会让人困惑。

继续看下面的代码:

代码语言:javascript
复制
xarr = [1.1,1.2,1.3,1.4,1.5]
yarr = [2.1,2.2,2.3,2.4,2.5]
cond = [True , False , True , True ,False]

result = [(x if c else y)
                    for x,y,c in zip(xarr,yarr,cond)]

print(result)

[1.1, 2.2, 1.3, 1.4, 2.5]

使用list存放数据的结果要比上面例子的结果规整一些,其实这是因为它存放在数组中进行了比较,那么numpy数组就会放大我们的精度。我们知道numpy数组关注的是数值的计算,其实这个地方仅仅是精度的问题。但是如果使用Python中的list列表的话会有几个问题:

  1. 它对于大数组的处理速度不是很快(因为所有工作都是由纯python完成的);
  2. 无法用于多维数组;

所以我们就有了numpy.where函数的出现:

代码语言:javascript
复制
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])
cond = np.array([True , False , True , True ,False])

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

[ 1.1  2.2  1.3  1.4  2.5]

注意:

  1. 本例中虽然传入的参数是数组类型,但是我们使用numpy并不仅仅局限于数组参数,所以where函数的参数可以是标量;
  2. 参数之间是有一定的对应关系的。
代码语言:javascript
复制
import numpy as np
array = np.where(True,[1,2,3],[4,5,8])#[True]也可以
#这个地方传进去的值是list,但是返回值还是数组
#where会自动把参数转换成numpy数组
print(type(array))
print(array)

<class 'numpy.ndarray'>
[1 2 3]
代码语言:javascript
复制
import numpy as np
array = np.where([True,False],[1,2,3],[4,5,8])
print(array)

Traceback (most recent call last):
  File "G:/Python源码/numpy_test/numpy_test.py", line 1439, in <module>
    array = np.where([True,False],[1,2,3],[4,5,8])
ValueError: operands could not be broadcast together with shapes (2,) (3,) (3,) 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • a numpy.where
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档