Python 二维数组布尔值缩减
Python 2d array boolean reduction
我有一个由布尔值 (True, False) 组成的二维数组。我想根据内容的逻辑函数将数组合并为一维。
例如
输入:
[[True, True, False],
[False, False, False],
[True, True, True]]
输出(逻辑与):
[False,
False,
True]
如果没有循环,这将如何完成?
您也可以在没有 NumPy 的情况下执行此操作。这是使用列表理解的一种解决方案。解释:它将遍历子列表,即使每个子列表中的一项是 False
,它也会输出 False
else 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]
您可以使用 numpy with the 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 个元素是 True
如果 all 个元素 i-th 行是 True
,否则是 False
。请注意,该列表应为 矩形 (所有子列表应包含 相同 个布尔值)。
在"pure"Python中,您也可以使用all
函数,如:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
如果 "matrix" 不是 而非 矩形,此方法也适用。请注意,对于 empty 子列表,这将 return True
,因为空子列表中的 all 元素是 True
.
我假设您想对行应用逻辑与。您可以申请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]
也能胜任这项工作。
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
功能更改为其他功能(例如,OR 或更冒险的功能)。
您可以使用 Python 的内置 all
方法和列表理解:
[all(x) for x in my_list]
如果这对您来说仍然太疯狂,请将其与 map
结合使用:
map(all, my_list)
请注意 map
不是 return Python 中的列表 3. 如果您想要一个列表作为结果,您可以改为调用 list(map(all, my_list))
。
我有一个由布尔值 (True, False) 组成的二维数组。我想根据内容的逻辑函数将数组合并为一维。
例如 输入:
[[True, True, False],
[False, False, False],
[True, True, True]]
输出(逻辑与):
[False,
False,
True]
如果没有循环,这将如何完成?
您也可以在没有 NumPy 的情况下执行此操作。这是使用列表理解的一种解决方案。解释:它将遍历子列表,即使每个子列表中的一项是 False
,它也会输出 False
else 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]
您可以使用 numpy with the 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 个元素是 True
如果 all 个元素 i-th 行是 True
,否则是 False
。请注意,该列表应为 矩形 (所有子列表应包含 相同 个布尔值)。
在"pure"Python中,您也可以使用all
函数,如:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
如果 "matrix" 不是 而非 矩形,此方法也适用。请注意,对于 empty 子列表,这将 return True
,因为空子列表中的 all 元素是 True
.
我假设您想对行应用逻辑与。您可以申请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]
也能胜任这项工作。
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
功能更改为其他功能(例如,OR 或更冒险的功能)。
您可以使用 Python 的内置 all
方法和列表理解:
[all(x) for x in my_list]
如果这对您来说仍然太疯狂,请将其与 map
结合使用:
map(all, my_list)
请注意 map
不是 return Python 中的列表 3. 如果您想要一个列表作为结果,您可以改为调用 list(map(all, my_list))
。