How to compare two numpy arrays of strings with the "in" operator to get a boolean array using array broadcasting?

Viewed 2519

Python allows for a simple check if a string is contained in another string:

'ab' in 'abcd'

which evaluates to True.

Now take a numpy array of strings and you can do this:

import numpy as np
A0 = np.array(['z', 'u', 'w'],dtype=object)

A0[:,None] != A0

Resulting in a boolean array:

array([[False,  True,  True],
       [ True, False,  True],
       [ True,  True, False]], dtype=bool)

Lets now take another array:

A1 = np.array(['u_w', 'u_z', 'w_z'],dtype=object)

I want to check where a string of A0 is not contained in a string in A1, essentially creating unique combinations, but the following does not yield a boolean array, only a single boolean, regardless of how I write the indices:

A0[:,None] not in A1

I also tried using numpy.in1d and np.ndarray.__contains__ but those methods don't seem to do the trick either.

Performance is an issue here so I want to make full use of numpy's optimizations.

How do I achieve this?

EDIT:

I found it can be done like this:

fv = np.vectorize(lambda x,y: x not in y)
fv(A0[:,None],A1)

But as the numpy docs state:

The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.

So this is the same as just looping over the array, and it would be nice to solve this without explicit or implicit for-loop.

1 Answers
Related