Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的All命令_Python_Arrays - Fatal编程技术网

Python中的All命令

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

我在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]))

我想我明白你的意思了。如果输入
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
冲突不是一个好主意。这只会使代码更难阅读,并导致不同的行为。非常好。现在我看到了这个问题。在进口方面吸取了很好的教训。谢谢。