Python中的All命令
我在Python中使用all命令,在所有条目都满足约束的情况下执行某些操作。例如,这里我检查所有条目是否都是正数,如果所有条目都是正数,则打印负数的数量。因此,理想情况下,如果所有数字都是正数,则输出为3,如果其中一个数字是负数,则输出为无。但是,我得到值2作为输出。为什么会这样Python中的All命令,python,arrays,Python,Arrays,我在Python中使用all命令,在所有条目都满足约束的情况下执行某些操作。例如,这里我检查所有条目是否都是正数,如果所有条目都是正数,则打印负数的数量。因此,理想情况下,如果所有数字都是正数,则输出为3,如果其中一个数字是负数,则输出为无。但是,我得到值2作为输出。为什么会这样 if all(x>0 for x in array([-10,1,2])): print sum(x>0 for x in array([-10,1,2])) 我想我明白你的意思了。如果输入I
if all(x>0 for x in array([-10,1,2])):
print sum(x>0 for x in array([-10,1,2]))
我想我明白你的意思了。如果输入
If
语句(意味着对条件进行了评估True
),则结果必须为3(因为肯定数-其中x>0
将是三者的全部)。同意
但是,在这种情况下,您甚至不输入if
语句,因为当以以下方式理解列表时,条件被评估为False
:
a = [x > 0 for x in array([-10, 2, 1])]
您应该得到[False,True,True]
,当将其作为all()
的参数调用时,将导致False
。因此,您甚至不会打印任何内容。也许你弄糊涂了,你在别的地方打印东西
无论哪种方式,都不会在我的系统上打印任何内容,因为它不应该打印任何内容。错误在数组中([-10,1,2])
我改用range,效果很好
if all(x > 0 for x in range(-10, 1, 2)):
print( sum(x > 0 for x in range(-10, 1, 2)))
为了更清楚地说明您正在使用Numpy,如果
来自Numpy导入*
,我将使用显式导入:
import numpy as np
if np.all(x>0 for x in np.array([-10,1,2])):
print np.sum(x>0 for x in np.array([-10,1,2]))
这里,x>0表示np.数组中的x([-10,1,2])
是一个生成器,并且
此外,您可能对过滤阵列感兴趣,为了实现您想要的,请直接在阵列上使用>0
,如下所示:
>>> import numpy as np
>>> a1 = np.array([-10,1,2])
>>> a2 = np.array([1,2,3])
>>> a1 > 0
array([False, True, True], dtype=bool)
>>> a2 > 0
array([ True, True, True], dtype=bool)
>>> np.all(a1 > 0)
False
>>> np.all(a2 > 0)
True
>>> import numpy as np
>>> g = (x>0 for x in array([-10,1,2]))
>>> g
<generator object <genexpr> at 0x7f0edfc3b640>
>>> l = list(g)
>>> l
[False, True, True]
>>> np.sum(l)
2
您可能对此感兴趣:
您将在中找到有关numpy.all
和生成器行为的更多信息
关于你的第二个问题(为什么是2而不是3),这是因为一旦你通过了测试条件,
np.sum
将True
视为1,将False
视为0。如果按如下方式展开生成器,则更容易看到:
>>> import numpy as np
>>> a1 = np.array([-10,1,2])
>>> a2 = np.array([1,2,3])
>>> a1 > 0
array([False, True, True], dtype=bool)
>>> a2 > 0
array([ True, True, True], dtype=bool)
>>> np.all(a1 > 0)
False
>>> np.all(a2 > 0)
True
>>> import numpy as np
>>> g = (x>0 for x in array([-10,1,2]))
>>> g
<generator object <genexpr> at 0x7f0edfc3b640>
>>> l = list(g)
>>> l
[False, True, True]
>>> np.sum(l)
2
>>将numpy作为np导入
>>>g=(x>0表示数组中的x([-10,1,2]))
>>>g
>>>l=列表(g)
>>>l
[假,真,真]
>>>np.总和(l)
2.
我假设您有理由使用数组,而不是简单的列表。但是,它是这样使用的(假设从array import array导入):
其中“i”表示这是一个有符号整数数组
不管您是使用上面的列表还是普通的旧列表,您都有一个正确的方法来计算正值的数量<当列表中的任何值为False
时,另一个答案中提到的code>all()
将导致False
,这使得您的原始代码永远不会进入if
块,但在这里它是完全多余的。如果您只想计算正值的数量,只需使用第二行:
sum(x > 0 for x in array('i', [-10, 1, 2]))
(当然,只要正确使用数组
。数组()的作用是什么?在我的机器上,你的代码不会打印任何东西。因此,我知道这是如何工作的……在我删除对array()
的调用后,这里也是如此。函数返回的任何内容都可能满足语句计算为True
“如果全部为正数,则打印负数”的条件?我想他是从numpy import*
或scipy import*中获得的,所以可能array
会产生一个numpy数组……这是令人惊讶的。我已经附上了我的窗口截图。它可以打印2。@好极了,这并不奇怪:[x>0代表数组中的x([-10,2,1])]
和(x>0代表数组中的x([-10,2,1])
(或者中没有括号的所有(…)
)是不同的:前者是一个列表,后者是一个生成器。谢谢Bruno。这最接近我想要的。但是,如果它在生成器上不起作用,为什么该语句的计算结果为TRUE并执行print命令?也许能给你一个更好的解释。这肯定会强化这样一种观点,即使用numpy import*
中的(或者通常使用…import*
中的),以避免numpy.all
与Python的本机all
冲突不是一个好主意。这只会使代码更难阅读,并导致不同的行为。非常好。现在我看到了这个问题。在进口方面吸取了很好的教训。谢谢。