Searching for column-indices of a multi-dimensional array that match multiple conditions (one condition per row)
Python is not Java

Not everything needs to be in a class

class MaskOps():

    @staticmethod
    def get_base(shape, value, dtype=int):
        """ This function produces a base-mask, the values of which may be overwritten. """
        if isinstance(value, (float, int)):
            res = np.ones(shape, dtype=dtype) * value
        elif isinstance(value, str):
            res = np.array([value for idx in range(np.prod(shape))]).reshape(shape)
        return res

    @staticmethod
    def alternate_base(shape, key):
        """ This function creates base-masks that consist of one of two value; the value depends on the index input as the parameter key. """
        if key % 2 == 0:
            value = 0.25
        else:
            value = 0.5
        return MaskOps().get_base(shape, value, dtype=float)

MO = MaskOps()


can just be 

def get_base(..):
    ...
def alternate_base(...):
    ...


looping

Python has a lot of elegant looping constructs

for idx in range(len(bases)):
    bases[idx][locs[idx]] = 0


for example is not one of them. This can be done with zip

for base, loc in zip(bases, locs):
     base[loc] = 0


Check out this talk (slides) for tips on enumerate, zip, generators etc.

return values, don't print them

When you print the value, it makes it harder to reuse this part of the code in another place. Better would be to split the core_algorithm in different functions all doing their part of the calculation, so you can test each of these parts individually, and decide how to print the result

use numpy  (#1)

You have a lot of numpy arrays that you make from list comprehensions. It would be a lot easier and clearer to vectorize this, and use numpy's large arsenal of native methods

def get_base(shape, value, dtype=int):
    """ This function produces a base-mask, the values of which may be overwritten. """
    if isinstance(value, (float, int)):
        res = np.ones(shape, dtype=dtype) * value
    elif isinstance(value, str):
        res = np.array([value for idx in range(np.prod(shape))]).reshape(shape)
    return res


can be more easily written as

def get_base(shape, value, dtype=int):
    dtypes = {int: int, float: float}
    if not dtype:
        dtype = dtypes.get(type(value), object)
    return np.ones(shape, dtype=dtype) * value


use numpy (#2)

Instead of making this boolean mask yourself, why not just do:

mask = data == [[i] for i in search_value]
collapsed_mask = mask.all(axis=0)
result = data[:, collapsed_mask]