基于python,如何理解numpy数据筛选where函数三种用法?
发布于 作者:苏南大叔 来源:程序如此灵动~

苏南大叔在本文中,要来说说numpy
的一个数据筛选函数.where()
,这个函数是典型的一个函数三种用法。不知道为啥要统一到一个.where()
函数里面。在网上,说这个.where()
函数是获取"不为0数据"的坐标的。这个说法很片面,这只是其中一种用法罢了。本文的观点可能和网上大多数的观点存在出入,欢迎留言给我。

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10
,python@3.11.0
,numpy@1.24.2
。这个.where()
,定义在numpy
上了,并没有定义在ndarray
类型上。所以,只能写成np.where()
,不能写成_ndarray.where()
。这是个单一的被动函数写法。
第一种用法,返回不为空值的元素的坐标
在这第一种用法里面,np.where(_ndarray)
要求_ndarray
的元素不为零【网上流传的说法】。苏南大叔认为:要求是不为空。
输出:
这是第一个返回值为tuple
的例子,其格式是([x1,x2...],[y1,y2...])
。所以,非空值的数据是:
1、(0,0)=>True
2、(1,1)=>np.nan
3、(2,1)=>1
4、(3,0)=>'9'
在这个例子里面,可以看到:
np.nan
/1
/True
/普通字符串,没有被当作空值。- 而
0
/False
/None
/空字符串,被处理成了空值。

上述结论得出后,可以翻过来再看原来的any()
和all()
的文章:
- https://newsn.net/say/python-any.html
- https://newsn.net/say/numpy-any.html
- https://newsn.net/say/python-all.html
- https://newsn.net/say/numpy-all.html
第二种用法,返回符合条件表达的数据
这是第二种使用方法,注意说法的变化,这里对数据并没有非零或者非空的要求。
输出:
第三种用法,根据条件修改后返回数据
满足条件condition
则返回x
, 不满足则输出y
。
输出:
这种用法,仅是返回合适的ndarray
数据,而不是返回对应数据的tuple
类型坐标。所以试图使用s[sn]
的时候,并不会得到期待的数据,甚至是会报错。
表格总结
np.where() | 参数 | 返回值 | 返回值类型 |
---|---|---|---|
第一种用法 | _ndarray | 不为空值的元素的坐标 | tuple |
第二种用法 | condition | 符合条件的元素的坐标 | tuple |
第三种用法 | condition,x,y | 根据条件分别对符合的数据和不符合的数据进行处理 | ndarray |
参考文献
结束语
更多更好的苏南大叔的python
经验文章,链接如下:


