详解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 23 Python
python爬虫入门教程之点点美女图片爬虫代码分享
Sep 02 Python
Python画图学习入门教程
Jul 01 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
python生成九宫格图片
Nov 19 Python
对python3中, print横向输出的方法详解
Jan 28 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
Python读取实时数据流示例
Dec 02 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
django中related_name的用法说明
May 20 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生成静态页
2006/11/25 PHP
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
非常漂亮的JS代码经典广告
2007/10/21 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
全面了解js中的script标签
2016/07/04 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
React实现轮播效果
2020/08/25 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
解决Python二维数组赋值问题
2019/11/28 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Python如何在bool函数中取值
2020/09/21 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
档案管理员岗位职责
2013/12/01 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
希特勒的演讲稿
2014/05/23 职场文书
建筑横幅标语
2014/10/09 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
现实表现证明材料
2015/06/19 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书