详解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实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
Python实现一个简单的验证码程序
Nov 03 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
Python装饰器用法实例总结
May 26 Python
Python中fnmatch模块的使用详情
Nov 30 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
如何给Python代码进行加密
Jan 10 Python
python中提高pip install速度
Feb 14 Python
python数字图像处理之对比度与亮度调整示例
Jun 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
多重?l件?合查?(二)
2006/10/09 PHP
destoon二次开发入门示例
2014/06/20 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
轻松实现php文件上传功能
2017/02/17 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
列表内容的选择
2006/06/30 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
Python实现简单状态框架的方法
2015/03/19 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
C#怎么让一个窗口居中显示?
2015/10/20 面试题
shell变量的作用空间是什么
2013/08/17 面试题
民族团结先进集体事迹材料
2014/05/22 职场文书
早读课迟到检讨书
2014/09/25 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
二审答辩状格式
2015/05/22 职场文书
青春雷锋观后感
2015/06/10 职场文书