对比.where()函数,如何理解numpy.argwhere()的两种用法?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
对比numpy
的.where()
函数,np.argwhere()
函数只有两种用法。并且返回值和np.where()
的返回值内容上基本一致,只是排列组合换了一个新的数据格式。所以,numpy
的.where()
数据筛选这事,要看情况来选用不同的函数了。算上.argwhere()
的两种写法,已经有五种不同的写法了。
苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10
,python@3.11.0
,numpy@1.24.2
。这个.argwhere()
,只能写成np.argwhere()
,不能写成ndarray.argwhere()
。这是个单一的函数写法。本文的兄弟文章:
第一种用法,不为空值的元素的坐标
np.argwhere(target)
不为空的元素,这点表述可能大家不认同,欢迎留言。空的经验范围:
np.nan
/1
/True
/普通字符串,没有被当作空值。- 而
0
/False
/None
/空字符串,被处理成了空值。
和.where()
的表述一样,都是返回坐标,但是实际上的返回值的格式非常不同。参考下面的例子:
import numpy as np
s = np.array([[True, False], [None, np.nan], [0, 1], ["9", ""]])
sn = np.where(s)
print(sn, type(sn)) # (array([0, 1, 2, 3], dtype=int64), array([0, 1, 1, 0], dtype=int64)) <class 'tuple'>
print(s[sn]) # [True nan 1 '9']
sn = np.argwhere(s)
print(sn, type(sn)) # 就是把tuple变形成了ndarray [[0 0] [1 1] [2 1] [3 0]] <class 'numpy.ndarray'>
print(s[sn]) # 没啥意义 [ [[True False] [True False]] ... [True False]] ]
for xy in sn:
print(s[ xy[0],xy[1] ]) # True nan 1 9
输出:
(array([0, 1, 2, 3], dtype=int64), array([0, 1, 1, 0], dtype=int64)) <class 'tuple'>
[True nan 1 '9']
[[0 0]
[1 1]
[2 1]
[3 0]] <class 'numpy.ndarray'>
[[[True False]
[True False]]
[[None nan]
[None nan]]
[[0 1]
[None nan]]
[['9' '']
[True False]]]
True
nan
1
9
第二种用法,返回符合条件表达的数据
np.argwhere(condition)
这是第二种使用方法,注意说法的变化,这里对数据并没有非零或者非空的要求,只是一个条件表达式。
import numpy as np
s = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
sn = np.where(s >= 3) # 找出所有>=3的元素的位置
print(sn,type(sn)) # (array([0, 1, 1, 1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2, 0, 1, 2], dtype=int64)) <class 'tuple'>
print(s[sn]) # [3 4 5 6 7 8 9]
sn = np.argwhere(s >= 3) # 找出所有>=3的元素的位置
print(sn,type(sn)) # [[0 2] [1 0] [1 1] [1 2] [2 0] [2 1] [2 2]]
print(s[sn]) # 没啥意义 [[[1 2 3] [7 8 9]] [[4 5 6] [1 2 3]] ... [7 8 9]]]
for xy in sn:
print(s[ xy[0],xy[1] ]) # 3 4 5 6 7 8 9
输出:
(array([0, 1, 1, 1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2, 0, 1, 2], dtype=int64)) <class 'tuple'>
[3 4 5 6 7 8 9]
[[0 2]
[1 0]
[1 1]
[1 2]
[2 0]
[2 1]
[2 2]] <class 'numpy.ndarray'>
[[[1 2 3]
[7 8 9]]
[[4 5 6]
[1 2 3]]
[[4 5 6]
[4 5 6]]
[[4 5 6]
[7 8 9]]
[[7 8 9]
[1 2 3]]
[[7 8 9]
[4 5 6]]
[[7 8 9]
[7 8 9]]]
3
4
5
6
7
8
9
第三种用法,不存在
np.argwhere()
不存在三个参数的情况,所以,没有第三种用法。
表格总结
根据这两篇文章,有下面的表格总结:
函数 | 返回值 | 返回值类型 | 求真实元素操作 |
---|---|---|---|
np.where(target) | ([x1,x2...],[y1,y2...]) | tuple | target[np.where(target)] |
np.where(condition) | ([x1,x2...],[y1,y2...]) | tuple | target[np.where(condition)] |
np.where(condition,x,y) | ([t1,t2..],[m1,m2...]) | ndarray | 无 |
np.argwhere(target) | [[x1,y1],[x2,y2]...] | ndarray | for...in: target[x,y] |
np.argwhere(condition) | [[x1,y1],[x2,y2]...] | ndarray | for...in: target[x,y] |
参考文献
- https://numpy.org/doc/stable/reference/generated/numpy.where.html
- https://numpy.org/doc/stable/reference/generated/numpy.argwhere.html
结束语
更多更好的苏南大叔的python
经验文章,链接如下:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。