What you're looking for is the numpy.equal ufunc, which doesn't seem to work for your use case.
In order to use it in the way you want, we need to explicitly broadcast the scalar to be compared into a numpy array of an appropriate shape:
import numpy as np
a = np.array(['a','b','c'])
res = np.empty(a.shape, dtype=bool)
np.equal(a, np.broadcast_to(['a'], a.shape), out=res)
Unfortunately the above call (1) ignores the broadcast and gives a constant result, and (2) is NotImplemented. We can try allocating a proper comparison array to enforce a proper elementwise comparison, to no avail:
>>> compare = np.full(a.shape, 'a')
>>> np.equal(a, compare)
NotImplemented
It seems that the efficient implementations via numpy ufuncs are only given for numeric types (I haven't had time to look into the source yet). But I don't expect higher-level functions to be able to directly work with your pre-allocated input arrays as buffers. With a compiled ufunc I could imagine that the out keyword argument lets you bypass the creation of a temporary array, but I don't think there's another alternative for you here.
'a' == np.array(['a', 'b', 'c'])? Try'a' == np.array(['a', 'b', 'c'])and the output should bearray([ True, False, False]); if you wantmaskto be alist, then just convert the result into a list.==and break the comparison up into smaller chunks, then store the result of the chunks in a pre-allocated array/list - unless you want to add functionality tonp.equalto handle strings.