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



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

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(),而不是popul_num本身的值。 如果布尔数组的任何值True,它将返回True,否则False

事实上,.any()测试任何"真实"值,对于整数意味着非零值,因此它将在整数数组上测试它们中的任何一个是否为非零,这就是你正在做的事情,但这不是测试你有兴趣知道的事情。 然后,代码通过对any返回的布尔值进行< 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方法返回一个布尔值,因此当您编写:

if popul_num.any() < 0:

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

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的内置函数(不是方法,因为它不属于类(,其用途与 numpy.any方法相同。这两个表达式在逻辑上是等效的:

any(popul_num < 0)
(popul_num < 0).any()

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

any()

是一种用于可迭代对象的方法。 它返回True可迭代对象中的任何项是否为真值。 你想要更像:

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

any((返回 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

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

最新更新