Numpy 第四章 逻辑函数
一.真值测试1.numpy.all函数所有元素是否为真原型numpy.all(a, axisNone, outNone, keepdimsnp._NoValue)a输入数组或可转换为数组的对象。axis指定检查的轴维度None时检查所有元素。out输出数组可选。keepdims是否保持维度可选。功能沿指定轴检查所有元素是否都为True或非零返回布尔值或布尔数组。例检查所有元素是否为真import numpy as np a np.array([1, 2, 3]) # 所有元素非零 → True print(np.all(a)) # True a np.array([1, 0, 3]) # 存在 0 → False print(np.all(a)) # False例沿轴检查二维数组x np.array([[1, 2], [3, 4]]) # axis0沿列检查每列的所有元素是否为真 print(np.all(x, axis0)) # [True True]两列的元素都非零 # axis1沿行检查每行的所有元素是否为真 print(np.all(x, axis1)) # [True True]两行的元素都非零 # axisNone检查所有元素 print(np.all(x)) # True所有元素非零2.numpy.any函数存在元素是否为真原型numpy.any(a, axisNone, outNone, keepdimsnp._NoValue)参数含义与all一致。功能沿指定轴检查是否存在至少一个元素为True或非零返回布尔值或布尔数组。例检查是否存在真元素import numpy as np a np.array([1, 0, 3]) # 存在 1、3 → True print(np.any(a)) # True a np.array([0, 0, 0]) # 全为 0 → False print(np.any(a)) # False例沿轴检查二维数组x np.array([[1, 0], [0, 4]]) # axis0沿列检查每列是否存在真元素 print(np.any(x, axis0)) # [True True]第一列有 1第二列有 4 # axis1沿行检查每行是否存在真元素 print(np.any(x, axis1)) # [True True]第一行有 1第二行有 4 # axisNone检查所有元素 print(np.any(x)) # True存在 1、43.结合布尔运算和索引的例import numpy as np # 示例 1数组比较 all/any a np.array([0, 4, 5]) b np.copy(a) # 深拷贝 print(np.all(a b)) # True所有元素相等 print(np.any(a b)) # True存在元素相等实际是全部 # 修改 a[0] 后验证 a[0] 1 print(np.all(a b)) # Falsea[0]≠b[0] print(np.any(a b)) # Truea[1]、a[2] 仍等于 b[1]、b[2] # 示例 2浮点数和 NaN 的特殊处理NaN 与自身不相等 print(np.all([1.0, np.nan])) # True1.0 是真nan 不影响不实际是all 会检查所有元素是否为真nan 在布尔上下文中视为 True不对numpy 中 nan 参与比较会返回 False但 all 是“所有元素是否为真”而 nan 本身的布尔值是 True这里可能需要更仔细分析 # 实际上numpy 中 np.all([1.0, np.nan]) 会返回 True因为 1.0 是 True而 nan 在布尔上下文中被视为 True但 1.0 np.nan 是 False。但 np.any([1.0, np.nan]) 也返回 True。 # 示例 3单位矩阵eye的 all/any 检查 a np.eye(3) # 3x3 单位矩阵对角线为 1其余为 0 print(np.all(a, axis0)) # [False False False]每列只有一个 1其余是 0 → 不是所有元素为真 print(np.any(a, axis0)) # [True True True]每列至少有一个 1对比函数功能示例一维数组[0,1,2]all所有元素是否为真非零np.all([0,1,2])→False存在 0any存在元素是否为真非零np.any([0,1,2])→True存在 1、2二.数组内容1.numpy.isnan检测数组中的 NaN 值原型numpy.isnan(x, *args, **kwargs)x输入数组通常是浮点数数组因为整数数组不会有 NaN。功能逐元素检测是否为NaNNot a Number返回布尔数组元素为NaN则为True否则False。例基础检测import numpy as np a np.array([1, 2, np.nan]) # np.nan 是 NaN 的表示 print(np.isnan(a)) # [False False True] # 只有第三个元素是 NaN2.NaN 的特性NaN是浮点数特有的整数数组无法直接存储NaN会报错或自动转为浮点数。NaN与任何值包括自身比较都返回False例如np.nan np.nan→False。因此检测NaN必须用isnan不能用或!。3.运用场景数据清洗检测数组/矩阵中的缺失值NaN并进行填充或删除。科学计算在浮点数运算中如除以零、无效运算结果可能为NaN需检测并处理。三.逻辑运算1.numpy.logical_not()函数逻辑非NOT功能对每个元素取反True→FalseFalse→True非0→False0→True。原型numpy.logical_not(x, *args, **kwargs)例标量输入import numpy as np print(np.logical_not(3)) # 3是非零→True不logical_not对“真值”取反。Python中3的真值是True所以取反后是False # False print(np.logical_not(0)) # 0的真值是False取反后是True # True例数组/序列输入# 对布尔列表取反 print(np.logical_not([True, False, 0, 1])) # [False True True False] # 解释True→FalseFalse→True0假→True1真→False例结合数组比较x np.arange(5) # [0,1,2,3,4] print(np.logical_not(x 3)) # [False False False True True] # 解释x3的结果是[True,True,True,False,False]取反后对应上述结果2.numpy.logical_and函数逻辑与AND功能逐元素判断x1 AND x2两个元素都为真时结果才为真。原型numpy.logical_and(x1, x2, *args, **kwargs)例标量输入print(np.logical_and(True, False)) # 一真一假→False # False例数组/序列输入逐元素运算# 两个布尔列表逐元素AND print(np.logical_and([True, False], [True, False])) # [ True False] # 解释(TrueTrue)True(FalseFalse)False # 数组比较的ANDx1 且 x4 x np.arange(5) # [0,1,2,3,4] print(np.logical_and(x 1, x 4)) # [False False True True False] # 解释x1→[F,F,T,T,F]x4→[T,T,T,T,F]逐元素AND后得到上述结果3.numpy.logical_or函数逻辑或OR功能逐元素判断x1 OR x2两个元素至少一个为真时结果为真。原型numpy.logical_or(x1, x2, *args, **kwargs)例标量输入print(np.logical_or(True, False)) # 一真一假→True # True例数组/序列输入逐元素运算# 两个布尔列表逐元素OR print(np.logical_or([True, False], [False, False])) # [ True False] # 解释(True|False)True(False|False)False # ORx1 或 x3 x np.arange(5) # [0,1,2,3,4] print(np.logical_or(x 1, x 3)) # [ True False False False True] # 解释x1→[T,F,F,F,F]x3→[F,F,F,F,T]逐元素OR后得到上述结果4.numpy.logical_xor函数逻辑异或XOR功能逐元素判断x1 XOR x2两个元素不同时结果为真相同时为假。原型numpy.logical_xor(x1, x2, *args, **kwargs)例标量输入print(np.logical_xor(True, False)) # 一真一假→True # True例数组/序列输入逐元素运算# 两个布尔列表逐元素XOR print(np.logical_xor([True, True, False, False], [True, False, True, False])) # [False True True False] # 解释(T^T)F(T^F)T(F^T)T(F^F)F 数组与矩阵的XOR0 与 np.eye(2) print(np.logical_xor(0, np.eye(2))) # [[ True False] # [False True]] # 解释np.eye(2)是[[1,0],[0,1]]0的逻辑值是False所以逐元素XORFalse ^ 1TrueFalse ^ 0False以此类推 # 数组比较的XORx1 异或 x3 x np.arange(5) # [0,1,2,3,4] print(np.logical_xor(x 1, x 3 [ True False False False True]不看图片示例 # 图片中示例print(np.logical_xor([True, True, False, False], [True, False, True, False])) → [False True True False] # 另一个示例print(np.logical_xor(0, np.eye(2))) → [[ True False], [False True]] # 再看图片中最后一个示例 x np(5) print(np.logical_xor(x 1, x 3)) # 图片中输出#[ True False False False True]不图片里的示例是 # print(np.logical_xor([True, True, False, False], [True, False, True, False])) # #[False True True False] # 而x[True,False,False,False,False]x3是[False,False,False,False,True]异或后 # True^FalseTrueFalse^FalseFalseFalse^FalseFalseFalse^FalseFalseFalse^TrueTrue → 所以结果是[True,False,False,False,True]和图片中的注释一致。注这四个函数都是逐元素进行逻辑运算支持数组、列表、标量混合输入会自动广播。逻辑运算的“真值”非0数值视为True0 视为False布尔值直接按True/False运算。常用于数组比较的组合条件比如x1 且 x4用logical_andx1 或 x3用logical_or等。四.对照1.比较函数NumPy 的比较函数支持元素级运算即对数组中的每个元素分别进行比较返回布尔值数组。这些函数与 Python 的运算符,,,!,,一一对应且功能完全等价。函数运算符含义numpy.greater(x1, x2)x1 x2大于numpy.greater_equal(x1, x2)x1 x2大于等于numpy.equal(x1, x2)x1 x2等于numpy.not_equal(x1, x2)x1 ! x2不等于numpy.less(x1, x2)x1 x2小于numpy.less_equal(x1, x2)x1 x2小于等于例import numpy as np x np.array([1, 2, 3, 4, 5, 6, 7, 8]) # 1. 大于 () / greater y x 2 print(x 2:, y) print(np.greater(x, 2):, np.greater(x, 2)) # 输出: [False False True True True True True True] # 2. 大于等于 () / greater_equal y x 2 print(\nx 2:, y) print(np.greater_equal(x, 2):, np.greater_equal(x, 2)) # 输出: [False True True True True True True True] # 3. 等于 () / equal y x 2 print(\nx 2:, y) print(np.equal(x, 2):, np.equal(x, 2)) # 输出: [False True False False False False False False] # 4. 不等于 (!) / not_equal y x ! 2 print(\nx ! 2:, y) print(np.not_equal(x, 2):, np.not_equal(x, 2)) # 输出: [ True False True True True True True True] # 5. 小于 () / less y x 2 print(\nx 2:, y) print(np.less(x, 2):, np.less(x, 2)) # 输出: [ True False False False False False False False] # 6. 小于等于 () / less_equal y x 2 print(\nx 2:, y) print(np.less_equal(x, 2):, np.less_equal(x, 2)) # 输出: [ True True False False False False False False]注元素级运算NumPy 会自动将标量如2与数组的每个元素进行比较无需显式循环。运算符重载NumPy 重载了 Python 的运算符因此x 2和np.greater(x, 2)的结果完全一致。布尔数组用途生成的布尔数组常用于条件筛选如x[x 2]会返回所有大于 2 的元素。性能优势这些函数在底层用 C 实现比手动写循环遍历数组快得多。常见应用场景数据清洗过滤异常值条件索引如x[x % 2 0]筛选偶数逻辑判断结合np.all()/np.any()检查整体条件2.numpy.isclose函数numpy.isclose(a, b, rtol1.e-5, atol1.e-8, equal_nanFalse)作用逐元素比较两个数组是否在指定容差范围内相等。返回值一个布尔数组长度与输入数组相同。判断条件对每个元素|a - b| atol rtol * |b|rtol相对容差Relative Tolerance默认1e-5。atol绝对容差Absolute Tolerance默认1e-8。equal_nan若为True则NaN被视为相等仅当两个数组在相同位置都为NaN时。适用场景比较浮点数是否“足够接近”避免因浮点运算误差导致的严格不等。3.numpy.allclose函数numpy.allclose(a, b, rtol1.e-5, atol1.e-8, equal_nanFalse)作用判断两个数组是否所有元素都在容差范围内相等。返回值单个布尔值True或False。等价写法numpy.all(isclose(a, b, rtolrtol, atolatol, equal_nanequal_nan))适用场景判断两个浮点数数组是否“整体近似相等”。特殊值处理NaN默认isclose和allclose认为NaN ! NaN返回False除非设置equal_nanTrue。Inf若两个数组在相同位置的Inf符号相同如都是inf或都是-inf则视为相等。例import numpy as np # 示例 1基本比较大数与小数 x np.isclose([1e10, 1e-7], [1.00001e10, 1e-8]) print(x np.isclose([1e10, 1e-7], [1.00001e10, 1e-8])) print(x) # [ True False ] x np.allclose([1e10, 1e-7], [1.00001e10, 1e-8]) print(\nx np.allclose([1e10, 1e-7], [1.00001e10, 1e-8])) print(x) # False x np.isclose([1e10, 1e-8], [1.00001e10, 1e-9]) print(\nx np.isclose([1e10, 1e-8], [1.00001e10, 1e-9])) print(x) # [ True True ] x np.allclose([1e10, 1e-8], [1.00001e10, 1e-9]) print(\nx np.allclose([1e10, 1e-8], [1.00001e10, 1e-9])) print(x) # True # 示例 2NaN 处理 x np.isclose([1.0, np.nan], [1.0, np.nan]) print(\nx np.isclose([1.0, np.nan], [1.0, np.nan])) print(x) # [ True False ] x np.allclose([1.0, np.nan], [1.0, np.nan]) print(\nx np.allclose([1.0, np.nan], [1.0, np.nan])) print(x) # False x np.isclose([1.0, np.nan], [1.0, np.nan], equal_nanTrue) print(\nx np.isclose([1.0, np.nan], [1.0, np.nan], equal_nanTrue)) print(x) # [ True True ] x np.allclose([1.0, np.nan], [1.0, np.nan], equal_nanTrue) print(\nx np.allclose([1.0, np.nan], [1.0, np.nan], equal_nanTrue)) print(x) # True分析代码示例输出说明np.isclose([1e10, 1e-7], [1.00001e10, 1e-8])[ True False ]第一个元素np.allclose([1e10, 1e-7], [1.00001e10, 1e-8])False因为有一个元素不满足isclosenp.isclose([1e10, 1e-8], [1.00001e10, 1e-9])[ True True ]第一个元素同上第二个元素np.allclose([1e10, 1e-8], [1.00001e10, 1e-9])True所有元素都满足isclosenp.isclose([1.0, np.nan], [1.0, np.nan])[ True False ]默认equal_nanFalseNaN ! NaN→Falsenp.allclose([1.0, np.nan], [1.0, np.nan])False同上np.isclose([1.0, np.nan], [1.0, np.nan], equal_nanTrue)[ True True ]equal_nanTrueNaN NaN→Truenp.allclose([1.0, np.nan], [1.0, np.nan], equal_nanTrue)True所有元素都满足isclose运用方法浮点数比较永远不要用比较浮点数应使用isclose或allclose。容差选择rtol适用于数值较大的情况相对误差。atol适用于数值接近 0 的情况绝对误差。NaN 处理若数组中可能包含NaN且希望将它们视为相等务必设置equal_nanTrue。性能考虑isclose是逐元素操作allclose是在isclose基础上做聚合适合最终判断“整体是否近似相等”。