详解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中定义结构体的方法
Mar 04 Python
python正则分析nginx的访问日志
Jan 17 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
Python实现ping指定IP的示例
Jun 04 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
python 中字典嵌套列表的方法
Jul 03 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
python pandas模块基础学习详解
Jul 03 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
python定义具名元组实例操作
Feb 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 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
php实现每日签到功能
2018/11/29 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
javascript截取字符串小结
2015/04/28 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
python实现门限回归方式
2020/02/29 Python
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
小学生迎国庆演讲稿
2014/09/05 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
2014全年工作总结
2014/11/27 职场文书
重阳节活动主持词
2015/07/04 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android