详解Python中where()函数的用法


Posted in Python onMarch 27, 2018

where()的用法

首先强调一下,where()函数对于不同的输入,返回的只是不同的。

1当数组是一维数组时,返回的值是一维的索引,所以只有一组索引数组

2当数组是二维数组时,满足条件的数组值返回的是值的位置索引,因此会有两组索引数组来表示值的位置

例如

>>>b=np.arange(10)
>>>b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>np.where(b>5)
 (array([6, 7, 8, 9], dtype=int64),)

>>>a=np.reshape(np.arange(20),(4,5))
>>>a 
array([[ 0, 1, 2, 3, 4],
    [ 5, 6, 7, 8, 9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18, 19]])
>>>np.where(a>10)
(array([2, 2, 2, 2, 3, 3, 3, 3, 3], dtype=int64),
 array([1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))

对numpy标准库里的解释做一个介绍:

numpy.where(condition[, x, y])

基于条件condition,返回值来自x或者y.

如果.

参数: condition : 数组,bool值 When True, yield x, otherwise yield y. x, y : array_like, 可选 x与y的shape要相同,当condition中的值是true时返回x对应位置的值,false是返回y的
返回值: out : ndarray or tuple of ndarrays ①如果参数有condition,x和y,它们三个参数的shape是相同的。那么,当condition中的值是true时返回x对应位置的值,false是返回y的。 ②如果参数只有condition的话,返回值是condition中元素值为true的位置索引,切是以元组形式返回,元组的元素是ndarray数组,表示位置的索引
>>> np.where([[True, False], [True, True]],
...     [[1, 2], [3, 4]],
...     [[9, 8], [7, 6]])
array([[1, 8],
    [3, 4]])
>>>
>>> np.where([[0, 1], [1, 0]])
(array([0, 1]), array([1, 0]))
>>>
>>> x = np.arange(9.).reshape(3, 3)
>>> np.where( x > 5 )
(array([2, 2, 2]), array([0, 1, 2]))
>>> x[np.where( x > 3.0 )]        # Note: result is 1D.
array([ 4., 5., 6., 7., 8.])
>>> np.where(x < 5, x, -1)        # Note: broadcasting.
array([[ 0., 1., 2.],
    [ 3., 4., -1.],
    [-1., -1., -1.]])
Find the indices of elements of x that are in goodvalues.

>>>
>>> goodvalues = [3, 4, 7]
>>> ix = np.in1d(x.ravel(), goodvalues).reshape(x.shape)
>>> ix
array([[False, False, False],
    [ True, True, False],
    [False, True, False]], dtype=bool)
>>> np.where(ix)
(array([1, 1, 2]), array([0, 1, 1]))

两种方法的示例代码

第一种用法

np.where(conditions,x,y)

if (condituons成立):

数组变x

else:

数组变y

import numpy as np
'''
x = np.random.randn(4,4)
print(np.where(x>0,2,-2))
#试试效果
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])
zarr = np.array([True,False,True,True,False])
result = [(x if c else y)
     for x,y,c in zip(xarr,yarr,zarr)]
print(result)

#where()函数处理就相当于上面那种方案

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

'''
#发现个有趣的东西
# #处理2组数组
# #True and True = 0
# #True and False = 1
# #False and True = 2
# #False and False = 3

cond2 = np.array([True,False,True,False])
cond1 = np.array([True,True,False,False])
#第一种处理 太长太丑
result = []
for i in range(4):
  if (cond1[i] & cond2[i]):  result.append(0);
  elif (cond1[i]):  result.append(1);
  elif (cond2[i]):  result.append(2);
  else : result.append(3);
print(result)
#第二种 直接where() 很快很方便
result = np.where(cond1 & cond2,0,np.where(cond1,1,np.where(cond2,2,3)))
print(result)
#第三种 更简便(好像这跟where()函数半毛钱的关系都没有
result = 1*(cond1 & -cond2)+2*(cond2 & -cond1)+3*(-(cond1 | cond2)) (没想到还可以这么表达吧)
print(result)

第二种用法

where(conditions)

相当于给出数组的下标

x = np.arange(16)
print(x[np.where(x>5)])
#输出:(array([ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype=int64),)

x = np.arange(16).reshape(-1,4)
print(np.where(x>5))

#(array([1, 1, 2, 2, 2, 2, 3, 3, 3, 3], dtype=int64), array([2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
#注意这里是坐标是前面的一维的坐标,后面是二维的坐标
ix = np.array([[False, False, False],
    [ True, True, False],
    [False, True, False]], dtype=bool)
print(np.where(ix))
#输出:(array([1, 1, 2], dtype=int64), array([0, 1, 1], dtype=int64))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过imaplib模块读取gmail里邮件的方法
May 08 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python对csv文件追加写入列的方法
Aug 01 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
python with (as)语句实例详解
Feb 04 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
Django基于ORM操作数据库的方法详解
Mar 27 #Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 #Python
Django学习笔记之ORM基础教程
Mar 27 #Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 #Python
Python安装图文教程 Pycharm安装教程
Mar 27 #Python
python 接口返回的json字符串实例
Mar 27 #Python
使用Django和Python创建Json response的方法
Mar 26 #Python
You might like
PHP框架Laravel学习心得体会
2015/10/28 PHP
轻松实现php文件上传功能
2017/02/17 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
js类中获取外部函数名的方法
2007/08/19 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
python音频处理用到的操作的示例代码
2017/10/27 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
在职研究生自我鉴定
2013/10/16 职场文书
管理部部长岗位职责
2013/12/05 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
介绍信的格式
2015/01/30 职场文书
老乡会致辞
2015/07/28 职场文书
小学数学教学随笔
2015/08/14 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
SpringBoot快速入门详解
2021/07/21 Java/Android
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS