我正在尝试编写一个脚本来模拟一段时间内的化学反应系统。该函数的输入之一是以下数组:
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
,因为在涉及整数的操作中,布尔值被视为0
和1
(分别针对False
和True
(。
你可以做:
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类型,例如list
和set
。
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。解决问题所需的是所有方法。