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

基于python自带的的any()函数,如何理解numpy中的.any()函数呢?这就是本文要阐述的问题。具体的来说,本文要对ndarray类型的变量,实现.any()操作,即判断其元素是否存在True。但是,基于ndarray类型的.any()操作是比较复杂的。本文也仅仅会对其做简要的描述,后续的高级参数部分,如果用得到,再写文章展开更深层次的描述。

苏南大叔:python代码,如何理解numpy.any()以及ndarray.any()函数? - numpy-any
python代码,如何理解numpy.any()以及ndarray.any()函数?(图2-1)

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

前文回顾

python自带的any()all(),是前文回顾的主要内容。这两个函数比较朴华无实,靠谱。参考文章:

但是,any()这个概念移植到numpy这边,就比较复杂了。有两个效果完全一样的分支。比如:

  • np.any(_ndarray)
  • _ndarray.any()

本文【重点】结论

np.any(np.array),其逻辑本质是对矩阵所有元素做【或】运算,存在True则返回True,不返回True的时候,也不一定返回False。请对比下面的实验结果,反复理解这句话。

  • 非零数字被理解为True
  • 返回的是传统的True和其它(不一定是False)。
  • 可能会各种报错,特别是元素中出现字符串的时候。
  • 算法上,可能是logic_or,并不是循环出某个元素,然后做个判断。所以,碰到一些无法执行or操作的对象,就会报错。

函数原型

函数原型:

numpy.any(arr, axis=None, out=None, keepdims=<no value>, *, where=<no value>)

对于二维数组来说,可以添加新的参数axis,来规定统计的范围。

  • axis=0,就是普通最常见的做账单的方式(比如超市小票),效果是从上到下,以列为单位。
  • axis=1,效果是从左到右,以行为单位。

参考文章:

对于其它参数,因为实在是用不到,这里暂作伏笔。

基础测试例子

import numpy as np

a1 = np.arange(5)  # [0  1  2  3  4]
a1 = np.arange(0, 5, 1)  # [0  1  2  3  4]
print(np.any(a1), a1.any())  # True True

a2 = np.arange(1, 5, 1)  # [1  2  3  4  5]
print(np.any(a2), a2.any())  # True True

a3 = np.array([[2, 4, 0], [1, 0, 0]])
print(np.any(a3), a3.any())  # True True
print(np.any(a3, axis=0))  # [ True  True False]
print(a3.any(axis=1))  # [ True  True]

a4 = np.array([False, False, True, False])
print(np.any(a4), a4.any())  #  True True
print(np.any(a4, axis=0))  # True
# print(a4.any(axis=1))  # 报错

稍稍复杂的例子

这里的代码的返回值,就不局限于True了,可能是False,也可能是其它。

import numpy as np

a5 = np.array([[False, False], [np.nan, 0], [None, None]])
print(np.any(a5), a5.any())  # nan nan
print(np.any(a5, axis=0))  # [nan None]
print(a5.any(axis=1))  # [False nan None]

a6 = np.array([["1", "2", "3"], ["False", None, True]])
print(np.any(a6), a6.any())  # 1 1
print(np.any(a6, axis=0))  # ['1' '2' '3']
print(a6.any(axis=1))  # ['1' 'False']

a7 = np.array(["", np.nan, False, 0, None])
print(np.any(a7), a7.any())  # nan nan
print(np.any(a7, axis=0))  # nan

主要看最后一个例子,返回值不是true,目前理解就是:它们可能都被当成空值。

苏南大叔:python代码,如何理解numpy.any()以及ndarray.any()函数? - 特殊情况返回值
python代码,如何理解numpy.any()以及ndarray.any()函数?(图2-2)

空数组

import numpy as np

a8 = np.array([])
print(np.any(a8), a8.any())  # False False
print(np.any(a8, axis=0))    # False

在空ndarray里面寻找为True的元素,没有找到,返回False

结束语

苏南大叔个人觉得,numpy目前的any()操作中,一些报错报的挺莫名其妙的。估计,后续numpy升级中,会对这部分逻辑进行更好的修复。

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

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

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

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