bshanks
bshanks

Reputation: 1248

Are there builtin functions for elementwise boolean operators over boolean lists?

For example, if you have n lists of bools of the same length, then elementwise boolean AND should return another list of that length that has True in those positions where all the input lists have True, and False everywhere else.

It's pretty easy to write, i just would prefer to use a builtin if one exists (for the sake of standardization/readability).

Here's an implementation of elementwise AND:

def eAnd(*args):
    return [all(tuple) for tuple in zip(*args)]

example usage:

>>> eAnd([True, False, True, False, True], [True, True, False, False, True], [True, True, False, False, True])
[True, False, False, False, True]

Upvotes: 28

Views: 31529

Answers (5)

ntg
ntg

Reputation: 14095

Try:

[ x&y for (x,y) in zip(list_a, list_b)]

If you are dealing with really long lists, or some of your variables are / need to be numpy arrays, the equivalent numpy code would be:

list( np.array(list_a) & np.array(list_b) )

modify it based on your needs.

Upvotes: 21

Tom
Tom

Reputation: 7951

The numpy.all function does what you want, if you specify the dimension to collapse on:

>>> all([[True, False, True, False, True], [True, True, False, False, True], [True, True, False, False, True]], 0)
array([ True, False, False, False,  True], dtype=bool)

Upvotes: 3

Mike Graham
Mike Graham

Reputation: 76693

There is not a built-in way to do this. Generally speaking, list comprehensions and the like are how you do elementwise operations in Python.

Numpy does provide this (using &, for technical limitations) in its array type. Numpy arrays usually perform operations elementwise.

Upvotes: 23

David Z
David Z

Reputation: 131600

No, I don't believe there's any such function in the standard library... especially when it's so easy to write in terms of the functions that are provided.

Upvotes: 1

Eli Bendersky
Eli Bendersky

Reputation: 273536

No, there are no such built-ins. Your method using zip and all / any is what I would use.

Upvotes: 1

Related Questions