Python 2d数组布尔减少

DnR*_*Rng 7 python arrays reduction

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

例如 输入:

[[True, True, False],
 [False, False, False],
 [True, True, True]]
Run Code Online (Sandbox Code Playgroud)

输出(逻辑AND):

[False,
 False,
 True]
Run Code Online (Sandbox Code Playgroud)

如果没有循环,这将如何完成?

Woo*_*193 8

您可以使用Python的内置all方法和列表理解:

[all(x) for x in my_list]
Run Code Online (Sandbox Code Playgroud)

如果这对你来说仍然太环节,请将其与map:

map(all, my_list)
Run Code Online (Sandbox Code Playgroud)

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


She*_*ore 5

你也可以在没有NumPy的情况下做到这一点.这是使用列表理解的一种解决方案.说明:它将遍历子列表,即使每个子列表中有一个项目False,它也会输出Falseelse 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]
Run Code Online (Sandbox Code Playgroud)

如下Jean所建议的替代方案(不那么冗长):

out = [False not in i for i in inp]
Run Code Online (Sandbox Code Playgroud)


tim*_*geb 4

我假设您想对行应用逻辑与。您可以申请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])
Run Code Online (Sandbox Code Playgroud)

对于没有 的解决方案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]
Run Code Online (Sandbox Code Playgroud)

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

>>> [all(sub) for sub in lst]
[False, False, True]
Run Code Online (Sandbox Code Playgroud)

也能完成这项工作。