详解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 相关文章推荐
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
仅利用30行Python代码来展示X算法
Apr 01 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
Django框架自定义session处理操作示例
May 27 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
jupyter notebook参数化运行python方式
Apr 10 Python
在keras里实现自定义上采样层
Jun 28 Python
Python调用飞书发送消息的示例
Nov 10 Python
5行Python代码实现一键批量扣图
Jun 29 Python
详解Python如何批量采集京东商品数据流程
Jan 22 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
收音机指标测试方法及仪器
2021/03/01 无线电
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
php.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
python记录程序运行时间的三种方法
2017/07/14 Python
Python实现的栈(Stack)
2018/01/26 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
python实现证件照换底功能
2019/08/20 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
金智子午JAVA面试题
2015/09/04 面试题
主治医师岗位职责
2013/12/10 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
高中生物教学反思
2016/02/20 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书