Python 2d数组布尔减少

时间:2018-10-15 19:47:22

标签: python arrays reduction

我有一个由布尔值(True,False)组成的2D数组。我想根据内容的逻辑功能将数组合并为一维。

例如 输入:

[[True, True, False],
 [False, False, False],
 [True, True, True]]

输出(逻辑与):

[False,
 False,
 True]

如何做到没有循环?

5 个答案:

答案 0 :(得分:8)

您可以将Python的内置all方法与列表理解结合使用:

[all(x) for x in my_list]

如果这对您来说仍然很麻烦,请将其与map结合使用:

map(all, my_list)

请注意,map不会在Python 3中返回列表。如果希望将列表作为结果,则可以调用list(map(all, my_list))

答案 1 :(得分:4)

您也可以在没有NumPy的情况下执行此操作。这是一种使用列表理解的解决方案。说明:它会循环遍历子列表,即使每个子列表中的一项是False,它也会输出False其他True

inp = [[True, True, False],[False, False, False],[True, True, True]]
out = [False if False in i else True for i in inp]
print (out)

# [False, False, True]

下面的让·吉(Jean)建议的替代方式(较不冗长):

out = [False not in i for i in inp]

答案 2 :(得分:3)

我假设您要对行应用逻辑AND。您可以应用numpy.all

>>> import numpy as np
>>> a = np.array([[True, True, False], [False, False, False], [True, True, True]])
>>> a
array([[ True,  True, False],
       [False, False, False],
       [ True,  True,  True]])
>>> 
>>> np.all(a, axis=1)
array([False, False,  True])

对于没有numpy的解决方案,可以使用operator.and_functools.reduce

>>> from operator import and_
>>> from functools import reduce
>>> 
>>> lst = [[True, True, False], [False, False, False], [True, True, True]]
>>> [reduce(and_, sub) for sub in lst]
[False, False, True]

编辑:实际上,在这种特殊情况下,reduce有点多余。

>>> [all(sub) for sub in lst]
[False, False, True]

做得很好。

答案 3 :(得分:2)

您可以通过numpy.all function来做到这一点:

>>> import numpy as np
>>> arr = np.array([[True, True, False],
... [False, False, False],
... [True, True, True]]
... )
>>> np.all(arr, axis=1)
array([False, False,  True])

因此,如果第 i 行的所有所有元素为{{1,则第 i 个元素为True }},否则True。请注意,列表应为矩形(所有子列表均应包含相同个布尔值)。

在“纯” Python中,您也可以使用False函数,例如:

all

如果“矩阵”不是矩形,这种方法也将有效。请注意,对于子列表,这将返回>>> data = [[True, True, False], [False, False, False], [True, True, True]] >>> list(map(all, data)) [False, False, True] ,因为空子列表中的所有元素均为True

答案 4 :(得分:2)

您也可以使用mapreduce来做到这一点:

from functools import reduce

l = [[True, True, False],
    [False, False, False],
    [True, True, True]]

final = list(map(lambda x: reduce(lambda a, b: a and b, x), l))
print(final)
# [False, False, True]

这样做的好处是您可以将reduce函数更改为其他功能(例如,“或”或更具冒险精神的功能)。