Python 的 Numpy 模块中 array 数组真值不明确的问题

问题描述

在对 array 数组进行值的操作时,经常会出现 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 。这句话的意思是 值错误:包含一个以上元素的数组的真值是不明确的,要使用a.any()或a.all()

例如,现有两个数组

A = array([
    [0, 1, 2],
    [1, 2, 3],
    [2, 3, 4]
])

B = array([
    [4, 3, 2],
    [3, 2, 1],
    [2, 1, 0]
])

当我们执行 A==B时, 我们可以得到

[[False False  True]
 [False  True False]
 [ True False False]]

的结果,这说明在 Numpy 中,数组的比较是两个数组对应的位置进行比较的。

当两个数组大小不一样时会抛出 DeprecationWarning: elementwise comparison failed; this will raise an error in the future. 的错误

如果我们试图把 A==B当成 if 条件,则会出现 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 错误

原因分析

Numpy 对逻辑表达式的判别不清楚,如果目标是逻辑相等则由于两边值都不为空而返回 True,如果目标是数值相等则由于 A 和 B 两个数组在数值上并不相等而返回 False,因此报错。

解决办法

使用 a.any() 或者 a.all()

a.any()表示存在一个为 True 就返回 True,否则返回False。A 和 B 存在相同位置上的值相同的数字,因此返回 True

a.all()表示只有所有都为 True 时才返回 True, 否则返回 False。A 和 B 并不是完全相等, 因此返回 False

A = array([
    [0, 1, 2],
    [1, 2, 3],
    [2, 3, 4]
])

B = array([
    [4, 3, 2],
    [3, 2, 1],
    [2, 1, 0]
])
if (A == B).all():
    print('use all()')
if (A == B).any():
    print('use any()')
运行结果
知识共享许可协议
Python 的 Numpy 模块中 array 数组真值不明确的问题Wantz 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
上一篇
下一篇