详解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交换变量
Sep 06 Python
python解析文件示例
Jan 23 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
Flask框架各种常见装饰器示例
Jul 17 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
对django views中 request, response的常用操作详解
Jul 17 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 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获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
input 高级限制级用法
2009/03/26 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
使用vue构建多页面应用的示例
2020/10/22 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
实习鉴定评语
2014/01/19 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
青年文明号口号
2014/06/17 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python