详解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正规则表达式学习指南
Aug 02 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
Sanic框架路由用法实例分析
Jul 16 Python
python单例模式实例解析
Aug 28 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
简单了解python的break、continue、pass
Jul 08 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
用python3读取python2的pickle数据方式
Dec 25 Python
如何利用python和DOS获取wifi密码
Mar 31 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
Python面向对象之内置函数相关知识总结
Jun 24 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下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
php自定义错误处理用法实例
2015/03/20 PHP
php实现Session存储到Redis
2015/11/11 PHP
Joomla开启SEF的方法
2016/05/04 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
php实例化一个类的具体方法
2019/09/19 PHP
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
详解vue axios二次封装
2018/07/22 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
python实现求特征选择的信息增益
2018/12/18 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
HTML5通用接口详解
2016/06/12 HTML / CSS
岗位职责的含义
2013/11/17 职场文书
中学家长会邀请函
2014/02/03 职场文书
保护环境建议书
2014/03/12 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL