Логическое сокращение массива Python 2d - PullRequest
0 голосов
/ 15 октября 2018

У меня есть двумерный массив, состоящий из логических значений (True, False).Я хотел бы объединить массив в 1D на основе логической функции содержимого.

например, Ввод:

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

Выход (логическое И):

[False,
 False,
 True]

Как это будет сделанобез петли?

Ответы [ 5 ]

0 голосов
/ 15 октября 2018

Вы можете использовать встроенный в Python метод all со списком:

[all(x) for x in my_list]

Если это все еще слишком сложно, объедините его с map:

map(all, my_list)

Обратите внимание, что map не возвращает список в Python 3. Если вы хотите получить список в качестве результата, вы можете вместо этого вызвать list(map(all, my_list)).

0 голосов
/ 15 октября 2018

Вы также можете сделать это с map и reduce:

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работать на что-то другое (скажем, на операционную систему или что-то более авантюрное).

0 голосов
/ 15 октября 2018

Вы можете сделать это с помощью с помощью функции numpy.all :

>>> 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, если все элементы i -ой строки: True и False в противном случае.Обратите внимание, что список должен быть прямоугольным (все подсписки должны содержать одинаковое число логических значений).

В "чистом" Python вы можете использовать allФункция также, как:

>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]

Этот подход будет работать также, если "матрица" не прямоугольной.Обратите внимание, что для пустого подсписка это вернет True, так как все элементов в пустом подсписке True.

0 голосов
/ 15 октября 2018

Я предполагаю, что вы хотите применить логические 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]

edit: фактически, reduce в данном конкретном случае немного избыточен.

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

делает работу так же хорошо.

0 голосов
/ 15 октября 2018

Вы можете сделать это и без 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]

Alternative (менее подробный)как предложено Джин ниже:

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