.any() Python 方法究竟是如何工作的?

How exactly does the .any() Python method work?

我正在尝试编写一个脚本来模拟随时间变化的化学反应系统。该函数的输入之一是以下数组:

popul_num = np.array([200, 100, 0, 0])

其中包含系统中每个物种的离散分子数。 main 函数的一部分有一个 if 语句,用于检查分子数是否为正。 if处理到下一次迭代,else跳出整个模拟

if popul_num.any() < 0: # Any method isn't working! --> Does .any() work on arrays or just lists? 
        print("Break out of loop negative molecule numbers")
        tao_all = tao_all[0:-1]
        popul_num_all = popul_num_all[0:-1]       
    else:
        break

我已经使用 .any() 尝试查找 popul_num 数组中是否有任何元素为负数。但它不起作用,它不抛出错误,系统只是从不进入 if 语句,我不明白为什么?

我刚刚 运行 程序,系统返回的最终分子数是:[135 -19 65 54] 程序应该在第二个元素到达 -19 之前就已经中断了。

有什么建议吗?

干杯

any() 是一种用于可迭代对象的方法。它 returns True 如果 iterable 中的任何项目是真实的。你想要更像:

if any([True for x in popul_num if x > 0]):
  print("at least one element was greater than zero!")

any() returns True,如果至少有一个元素是True:

L1 = [False, False, False]
any(L1)
# >>> False

L1 = [True, False, False]
any(L1)
# >>> True

L1 = ["Hi", False, False]
any(L1)
# >>> True

L1 = []
any(L1)
# >>> False

any() returns 如果 NumPy 数组中至少一个元素的计算结果为真,则为真,np.all 测试是否所有数组元素沿给定轴的计算结果为真。解决你的问题需要的是all方法。

您应该在 进行比较后对布尔数组 使用 .any(),而不是 popul_num 本身的值。如果布尔数组的任何值是 True,它将 return True,否则 False.

事实上,.any() 测试任何“”值,这对于整数意味着非零值,所以它会在一个整数数组上工作以测试它们是否是非零,这就是您正在做的事情,但这并不是在测试您有兴趣了解的事情。然后代码通过对由 any 编辑的布尔值 return 进行 < 0 测试来使问题复杂化,它总是计算 True 因为布尔值被视为 01(分别对应 FalseTrue)涉及整数的运算。

你可以这样做:

if (popul_num < 0).any():
    do_whatever

这里popul_num < 0是一个布尔数组,包含逐个元素比较的结果。在你的例子中:

>>> popul_num < 0
array([False, False, False, False], dtype=bool)

但是,您使用 array.any()(或 np.any(array))而不是使用内置 any() 是正确的。后者恰好适用于一维数组,但不适用于更多维度。这是因为迭代例如在 4d 数组上(这是内置 any() 会做的)给出一系列 3d 数组,而不是单个元素。

也有类似的.all()。上面的测试相当于:

if not (popul_num >= 0).all():

numpy数组的any方法return是一个布尔值,所以写的时候:

if popul_num.any() < 0:

popul_num.any() 将是 True (=1) 或 False (=0),因此它永远不会小于零。因此,您将永远不会输入此 if 语句。

any() 所做的是将数组的每个元素评估为布尔值,并 return 它们中的 any 是否为真。例如:

>>> np.array([0.0]).any()
False

>>> np.array([1.0]).any()
True

>>> np.array([0.0, 0.35]).any()
True

如您所见,Python/numpy 认为 0 为假,所有其他数字为真。因此,对数字数组调用 any 可以告诉我们数组中的任何数字是否非零。但是你想知道有没有一个数是负数,所以我们得先转数组。让我们在你的数组中引入一个负数来演示。

>>> popul_num = np.array([200, 100, 0, -1])
>>> popul_num < 0  # Test is applied to all elements in the array
np.ndarray([False, False, False, True])
>>> (popul_num < 0).any()
True

您询问了关于列表与数组的 any。 Python 的内置 list 没有 any 方法:

>>> [].any()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'any'

有一个名为 any 的内置 function(不是方法,因为它不属于 class),其作用与numpy .any 方法。这两个表达式在逻辑上是等价的:

any(popul_num < 0)

(popul_num < 0).any()

我们通常希望第二个更快,因为 numpy 是用 C 实现的。但是只有第一个可以使用非 numpy 类型,例如 listset