我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

对比numpy.where()函数,np.argwhere()函数只有两种用法。并且返回值和np.where()的返回值内容上基本一致,只是排列组合换了一个新的数据格式。所以,numpy.where()数据筛选这事,要看情况来选用不同的函数了。算上.argwhere()的两种写法,已经有五种不同的写法了。

苏南大叔:对比.where()函数,如何理解numpy.argwhere()的两种用法? - numpy-argwhere
对比.where()函数,如何理解numpy.argwhere()的两种用法?(图2-1)

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10python@3.11.0numpy@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

苏南大叔:对比.where()函数,如何理解numpy.argwhere()的两种用法? - argwhere-code-result
对比.where()函数,如何理解numpy.argwhere()的两种用法?(图2-2)

输出:

(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...])tupletarget[np.where(target)]
np.where(condition)([x1,x2...],[y1,y2...])tupletarget[np.where(condition)]
np.where(condition,x,y)([t1,t2..],[m1,m2...])ndarray
np.argwhere(target)[[x1,y1],[x2,y2]...]ndarrayfor...in: target[x,y]
np.argwhere(condition)[[x1,y1],[x2,y2]...]ndarrayfor...in: target[x,y]

参考文献

结束语

更多更好的苏南大叔的python经验文章,链接如下:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python