Python 2d array boolean reduction
Clash Royale CLAN TAG#URR8PPP
up vote
7
down vote
favorite
I've got a 2D array comprised of boolean values (True,False). I'd like to consolidate the array to a 1D based on a logical function of the contents.
e.g.
Input:
[[True, True, False],
[False, False, False],
[True, True, True]]
Output (logical AND):
[False,
False,
True]
How would this be done without a loop ?
python arrays reduction
add a comment |Â
up vote
7
down vote
favorite
I've got a 2D array comprised of boolean values (True,False). I'd like to consolidate the array to a 1D based on a logical function of the contents.
e.g.
Input:
[[True, True, False],
[False, False, False],
[True, True, True]]
Output (logical AND):
[False,
False,
True]
How would this be done without a loop ?
python arrays reduction
add a comment |Â
up vote
7
down vote
favorite
up vote
7
down vote
favorite
I've got a 2D array comprised of boolean values (True,False). I'd like to consolidate the array to a 1D based on a logical function of the contents.
e.g.
Input:
[[True, True, False],
[False, False, False],
[True, True, True]]
Output (logical AND):
[False,
False,
True]
How would this be done without a loop ?
python arrays reduction
I've got a 2D array comprised of boolean values (True,False). I'd like to consolidate the array to a 1D based on a logical function of the contents.
e.g.
Input:
[[True, True, False],
[False, False, False],
[True, True, True]]
Output (logical AND):
[False,
False,
True]
How would this be done without a loop ?
python arrays reduction
python arrays reduction
edited 58 mins ago
Willem Van Onsem
131k16125210
131k16125210
asked 1 hour ago
DnRng
735
735
add a comment |Â
add a comment |Â
5 Answers
5
active
oldest
votes
up vote
4
down vote
You can do this without NumPy too. Here is one solution using list comprehension. Explanation: It will loop over sub-lists and even if one of the items in each sub-list is False
, it outputs 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 (less verbose) as suggested by Jean below:
out = [False not in i for i in inp]
out = [False if False in i else True for i in inp]
is a cumbersome way to writeout = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
This is clever but not exactly equivalent tox1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as0
). Of course, OP explicitly said boolean values, so this is just a sidenote.
â timgeb
44 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
add a comment |Â
up vote
4
down vote
You can use Python's built-in all
method with a list-comprehension:
[all(x) for x in my_list]
If that's still too loopy for you, combine it with map
:
map(all, my_list)
Note that map
doesn't return a list in Python 3. If you want a list as your result, you can call list(map(all, my_list))
instead.
1
brilliant use ofall
â Jean-François Fabre
57 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
careful withmap
in python 3 though, as it doesn't create a list (but is even better when used within a loop)
â Jean-François Fabre
55 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
add a comment |Â
up vote
3
down vote
I'm assuming you want to apply logical ANDs to the rows. You can apply 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])
For a solution without numpy
, you can use operator.and_
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: actually, reduce
is a bit redundant in this particular case.
>>> [all(sub) for sub in lst]
[False, False, True]
does the job just as well.
add a comment |Â
up vote
2
down vote
You can do this with 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])
Here thus the i-th element is True
if all elements of the i-th row are True
, and False
otherwise. Note that the list should be rectangular (all sublists should contain the same number of booleans).
In "pure" Python, you can use the all
function as well, like:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
This approach will work as well if the "matrix" is not rectangular. Note that for an empty sublist, this will return True
, since all elements in an empty sublist are True
.
add a comment |Â
up vote
2
down vote
You can also do this with map
and 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]
The benefit here is that you can change the reduce
function to something else (say, an OR or something more adventurous).
add a comment |Â
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
You can do this without NumPy too. Here is one solution using list comprehension. Explanation: It will loop over sub-lists and even if one of the items in each sub-list is False
, it outputs 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 (less verbose) as suggested by Jean below:
out = [False not in i for i in inp]
out = [False if False in i else True for i in inp]
is a cumbersome way to writeout = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
This is clever but not exactly equivalent tox1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as0
). Of course, OP explicitly said boolean values, so this is just a sidenote.
â timgeb
44 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
add a comment |Â
up vote
4
down vote
You can do this without NumPy too. Here is one solution using list comprehension. Explanation: It will loop over sub-lists and even if one of the items in each sub-list is False
, it outputs 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 (less verbose) as suggested by Jean below:
out = [False not in i for i in inp]
out = [False if False in i else True for i in inp]
is a cumbersome way to writeout = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
This is clever but not exactly equivalent tox1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as0
). Of course, OP explicitly said boolean values, so this is just a sidenote.
â timgeb
44 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
add a comment |Â
up vote
4
down vote
up vote
4
down vote
You can do this without NumPy too. Here is one solution using list comprehension. Explanation: It will loop over sub-lists and even if one of the items in each sub-list is False
, it outputs 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 (less verbose) as suggested by Jean below:
out = [False not in i for i in inp]
You can do this without NumPy too. Here is one solution using list comprehension. Explanation: It will loop over sub-lists and even if one of the items in each sub-list is False
, it outputs 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 (less verbose) as suggested by Jean below:
out = [False not in i for i in inp]
edited 58 mins ago
answered 1 hour ago
Bazingaa
6,9951822
6,9951822
out = [False if False in i else True for i in inp]
is a cumbersome way to writeout = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
This is clever but not exactly equivalent tox1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as0
). Of course, OP explicitly said boolean values, so this is just a sidenote.
â timgeb
44 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
add a comment |Â
out = [False if False in i else True for i in inp]
is a cumbersome way to writeout = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
This is clever but not exactly equivalent tox1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as0
). Of course, OP explicitly said boolean values, so this is just a sidenote.
â timgeb
44 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
out = [False if False in i else True for i in inp]
is a cumbersome way to write out = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
out = [False if False in i else True for i in inp]
is a cumbersome way to write out = [False not in i for i in inp]
â Jean-François Fabre
59 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
@Jean-FrançoisFabre: I added your suggestion too. Thanks :)
â Bazingaa
58 mins ago
This is clever but not exactly equivalent to
x1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as 0
). Of course, OP explicitly said boolean values, so this is just a sidenote.â timgeb
44 mins ago
This is clever but not exactly equivalent to
x1 and x2 and ... xn
for each sublist when you can have other falsy values in the sublists (such as 0
). Of course, OP explicitly said boolean values, so this is just a sidenote.â timgeb
44 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
Well the OP said itâÂÂs only True or False so my sokution addressed that
â Bazingaa
12 mins ago
add a comment |Â
up vote
4
down vote
You can use Python's built-in all
method with a list-comprehension:
[all(x) for x in my_list]
If that's still too loopy for you, combine it with map
:
map(all, my_list)
Note that map
doesn't return a list in Python 3. If you want a list as your result, you can call list(map(all, my_list))
instead.
1
brilliant use ofall
â Jean-François Fabre
57 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
careful withmap
in python 3 though, as it doesn't create a list (but is even better when used within a loop)
â Jean-François Fabre
55 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
add a comment |Â
up vote
4
down vote
You can use Python's built-in all
method with a list-comprehension:
[all(x) for x in my_list]
If that's still too loopy for you, combine it with map
:
map(all, my_list)
Note that map
doesn't return a list in Python 3. If you want a list as your result, you can call list(map(all, my_list))
instead.
1
brilliant use ofall
â Jean-François Fabre
57 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
careful withmap
in python 3 though, as it doesn't create a list (but is even better when used within a loop)
â Jean-François Fabre
55 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
add a comment |Â
up vote
4
down vote
up vote
4
down vote
You can use Python's built-in all
method with a list-comprehension:
[all(x) for x in my_list]
If that's still too loopy for you, combine it with map
:
map(all, my_list)
Note that map
doesn't return a list in Python 3. If you want a list as your result, you can call list(map(all, my_list))
instead.
You can use Python's built-in all
method with a list-comprehension:
[all(x) for x in my_list]
If that's still too loopy for you, combine it with map
:
map(all, my_list)
Note that map
doesn't return a list in Python 3. If you want a list as your result, you can call list(map(all, my_list))
instead.
edited 54 mins ago
answered 58 mins ago
Woody1193
1,295624
1,295624
1
brilliant use ofall
â Jean-François Fabre
57 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
careful withmap
in python 3 though, as it doesn't create a list (but is even better when used within a loop)
â Jean-François Fabre
55 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
add a comment |Â
1
brilliant use ofall
â Jean-François Fabre
57 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
careful withmap
in python 3 though, as it doesn't create a list (but is even better when used within a loop)
â Jean-François Fabre
55 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
1
1
brilliant use of
all
â Jean-François Fabre
57 mins ago
brilliant use of
all
â Jean-François Fabre
57 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
@Jean-FrançoisFabre Thank you very much
â Woody1193
56 mins ago
careful with
map
in python 3 though, as it doesn't create a list (but is even better when used within a loop)â Jean-François Fabre
55 mins ago
careful with
map
in python 3 though, as it doesn't create a list (but is even better when used within a loop)â Jean-François Fabre
55 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
@Jean-FrançoisFabre True, I'll make a note of it
â Woody1193
54 mins ago
add a comment |Â
up vote
3
down vote
I'm assuming you want to apply logical ANDs to the rows. You can apply 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])
For a solution without numpy
, you can use operator.and_
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: actually, reduce
is a bit redundant in this particular case.
>>> [all(sub) for sub in lst]
[False, False, True]
does the job just as well.
add a comment |Â
up vote
3
down vote
I'm assuming you want to apply logical ANDs to the rows. You can apply 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])
For a solution without numpy
, you can use operator.and_
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: actually, reduce
is a bit redundant in this particular case.
>>> [all(sub) for sub in lst]
[False, False, True]
does the job just as well.
add a comment |Â
up vote
3
down vote
up vote
3
down vote
I'm assuming you want to apply logical ANDs to the rows. You can apply 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])
For a solution without numpy
, you can use operator.and_
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: actually, reduce
is a bit redundant in this particular case.
>>> [all(sub) for sub in lst]
[False, False, True]
does the job just as well.
I'm assuming you want to apply logical ANDs to the rows. You can apply 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])
For a solution without numpy
, you can use operator.and_
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: actually, reduce
is a bit redundant in this particular case.
>>> [all(sub) for sub in lst]
[False, False, True]
does the job just as well.
edited 53 mins ago
answered 1 hour ago
timgeb
38.8k105177
38.8k105177
add a comment |Â
add a comment |Â
up vote
2
down vote
You can do this with 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])
Here thus the i-th element is True
if all elements of the i-th row are True
, and False
otherwise. Note that the list should be rectangular (all sublists should contain the same number of booleans).
In "pure" Python, you can use the all
function as well, like:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
This approach will work as well if the "matrix" is not rectangular. Note that for an empty sublist, this will return True
, since all elements in an empty sublist are True
.
add a comment |Â
up vote
2
down vote
You can do this with 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])
Here thus the i-th element is True
if all elements of the i-th row are True
, and False
otherwise. Note that the list should be rectangular (all sublists should contain the same number of booleans).
In "pure" Python, you can use the all
function as well, like:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
This approach will work as well if the "matrix" is not rectangular. Note that for an empty sublist, this will return True
, since all elements in an empty sublist are True
.
add a comment |Â
up vote
2
down vote
up vote
2
down vote
You can do this with 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])
Here thus the i-th element is True
if all elements of the i-th row are True
, and False
otherwise. Note that the list should be rectangular (all sublists should contain the same number of booleans).
In "pure" Python, you can use the all
function as well, like:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
This approach will work as well if the "matrix" is not rectangular. Note that for an empty sublist, this will return True
, since all elements in an empty sublist are True
.
You can do this with 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])
Here thus the i-th element is True
if all elements of the i-th row are True
, and False
otherwise. Note that the list should be rectangular (all sublists should contain the same number of booleans).
In "pure" Python, you can use the all
function as well, like:
>>> data = [[True, True, False], [False, False, False], [True, True, True]]
>>> list(map(all, data))
[False, False, True]
This approach will work as well if the "matrix" is not rectangular. Note that for an empty sublist, this will return True
, since all elements in an empty sublist are True
.
answered 1 hour ago
Willem Van Onsem
131k16125210
131k16125210
add a comment |Â
add a comment |Â
up vote
2
down vote
You can also do this with map
and 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]
The benefit here is that you can change the reduce
function to something else (say, an OR or something more adventurous).
add a comment |Â
up vote
2
down vote
You can also do this with map
and 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]
The benefit here is that you can change the reduce
function to something else (say, an OR or something more adventurous).
add a comment |Â
up vote
2
down vote
up vote
2
down vote
You can also do this with map
and 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]
The benefit here is that you can change the reduce
function to something else (say, an OR or something more adventurous).
You can also do this with map
and 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]
The benefit here is that you can change the reduce
function to something else (say, an OR or something more adventurous).
edited 51 mins ago
answered 58 mins ago
slider
2,900926
2,900926
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52823751%2fpython-2d-array-boolean-reduction%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password