1.前言

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

双目运算符:3 + 4

三目运算符:

格式:比较(关系)表达式?表达式1:表达式2;

比较表达式:结果是一个boolean类型。

执行流程:

根据比较(关系)表达式的计算返回一个ture或者false。

如果是true,就把表达式1作为结果。

如果是false,就把表达式2作为结果。

这里为什么要提一下其它编程语言中的三元表达式呢?因为在Python没有使用这种通用格式来实现三目表达式,而是使用下面的格式来实现三元表达式:为真时的结果 if 判定条件 else 为假时的结果

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

print('4') if 2 < 4 else print('2')
2. numpy.where

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

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]
上面例子的输出结果会让人迷惑。继续看下面的代码:
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列表的话会有几个问题:它对于大数组的处理速度不是很快(因为所有工作都是由纯python完成的);

无法用于多维数组;

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

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]

注意:本例中虽然传进的参数是数组类型,但是我们使用numpy并不仅仅局限于数组参数,所以where函数的参数可以是标量;

参数之间是有一定的对应关系的。

import numpy as np
array = np.where(True,[1,2,3],[4,5,8])#[True]也可以
#这个地方传进去的值是list,但是返回值还是数组
#where会自动把参数转换成numpy数组
print(type(array))
print(array)
[1 2 3]
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 
array = np.where([True,False],[1,2,3],[4,5,8])
ValueError: operands could not be broadcast together with shapes (2,) (3,) (3,)