python代码,如何理解numpy.all()以及ndarray.all()函数?
发布于 作者:苏南大叔 来源:程序如此灵动~
基于python自带的的all()函数,如何理解numpy中的.all()函数呢?这就是本文要阐述的问题。具体的来说,本文要对ndarray类型的变量,实现.all()操作,即判断其元素是否全部为True。但是,基于ndarray类型的.all()操作是比较复杂的。本文也仅仅会对其做简要的描述,后续的高级参数部分,如果用得到,再写文章展开更深层次的描述。

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10,python@3.11.0,numpy@1.24.2。
前文回顾
python自带的any()和all(),是前文回顾的主要内容。这两个函数比较朴华无实,靠谱。参考文章:
- https://newsn.net/say/python-any.html
- https://newsn.net/say/python-all.html
- https://newsn.net/say/ndarray-flatten.html
但是.all()这个概念移植到numpy这边,就比较复杂了。有两个看起来效果完全一样的分支。比如:
np.all(_ndarray)_ndarray.all()
在以前的文章中,就曾经使用这个ndarray.all()来判断两个ndarray数组是否相等。参考文章:
本文【重点】结论
np.all(np.array),其逻辑本质是对矩阵所有元素做【与】运算,有一个不为True则返回False。不返回False的时候,也不一定返回True。请对比下面的实验结果,反复理解这句话。
- 非零数字被理解为
True。 - 返回的是传统的
True和其它(不一定是False)。 - 可能会各种报错,特别是元素中出现字符串的时候。
- 算法上,可能是
logic_and,并不是循环出某个元素,然后做个判断。所以,碰到一些无法执行and操作的对象,就会报错。
函数原型
函数原型:
numpy.all(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.all(a1), a1.all()) # False False 0被理解为false
a2 = np.arange(1, 5, 1) # [1 2 3 4 5]
print(np.all(a2), a2.all()) # True True
a3 = np.array([[2, 4, 0], [1, 0, 0]])
print(np.all(a3), a3.all()) # False False
print(np.all(a3, axis=0)) # [ True False False]
print(a3.all(axis=1)) # [False False]
a4 = np.array([False, False, True, False])
print(np.all(a4), a4.all()) # False False
print(np.all(a4, axis=0)) # False
# print(a4.all(axis=1)) # 报错这个例子中,需要注意的是:
数字0是被当成False对待的。所以,第一个np.arange(5)里面的起始值0就妥妥的做了背锅侠。
稍稍复杂的例子
这里的代码的返回值,就不局限于False了,可能是True,也可能是其它。
import numpy as np
a5 = np.array([[False, False], [np.nan, 0], [None, None]])
print(np.all(a5), a5.all()) # False False
print(np.all(a5, axis=0)) # [False False]
print(a5.all(axis=1)) # [False 0 None]
a6 = np.array([["1", "2", "3"], ["False", None, True]])
print(np.all(a6), a6.all()) # None None
print(np.all(a6, axis=0)) # ['False' None True]
print(a6.all(axis=1)) # ['3' None]
a7 = np.array(["", np.nan, False, 0, None])
print(np.all(a7), a7.all()) # 啥输出都没有,实际输出的是空字符串
print(np.all(a7, axis=0)) # 啥输出都没有,实际输出的是空字符串
空数组
import numpy as np
a8 = np.array([])
print(np.all(a8), a8.all()) # True True
print(np.all(a8, axis=0)) # True在空ndarray里面寻找非空元素,没有找到,返回True。
import numpy as np
print(np.all(np.array([])), np.array([]).all(), all([])) # True True True
print(np.any(np.array([])), np.array([]).any(), any([])) # False False Falsenumpy里面的all(),和自带的all(),对待空数组的时候,态度是一致的。
结束语
苏南大叔个人觉得,numpy目前的all()操作中,一些报错报的挺莫名其妙的。估计在后续的numpy升级中,会对这部分逻辑进行更好的修复。