.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
因为布尔值被视为 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
方法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 类型,例如 list
和 set
。
我正在尝试编写一个脚本来模拟随时间变化的化学反应系统。该函数的输入之一是以下数组:
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
因为布尔值被视为 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
方法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 类型,例如 list
和 set
。