Repository: numpy/numpy
File: numpy/ma/core.pyi (Python)

Code before:
    @property
    def flat(self): ...
    @flat.setter
    def flat(self, value): ...
    @property
    def fill_value(self): ...
    @fill_value.setter
    def fill_value(self, value=...): ...
    get_fill_value: Any
    set_fill_value: Any
    def filled(self, fill_value=...): ...
    def compressed(self): ...
    def compress(self, condition, axis=..., out=...): ...
    def __eq__(self, other): ...
    def __ne__(self, other): ...

    @overload
    def __ge__(self: _MaskedArrayNumber_co, other: _ArrayLikeNumber_co, /) -> _MaskedArray[bool_]: ...
    @overload
    def __ge__(self: _MaskedArrayTD64_co, other: _ArrayLikeTD64_co, /) -> _MaskedArray[bool_]: ...
    @overload
    def __ge__(self: _MaskedArray[datetime64], other: _ArrayLikeDT64_co, /) -> _MaskedArray[bool_]: ...
    @overload
    def __ge__(self: _MaskedArray[object_], other: Any, /) -> _MaskedArray[bool_]: ...
    @overload
    def __ge__(self: _MaskedArray[Any], other: _ArrayLikeObject_co, /) -> _MaskedArray[bool_]: ...

    def __gt__(self, other): ...
    def __le__(self, other): ...
    def __lt__(self, other): ...
    def __add__(self, other): ...
    def __radd__(self, other): ...
    def __sub__(self, other): ...
    def __rsub__(self, other): ...
    def __mul__(self, other): ...
    def __rmul__(self, other): ...
    def __div__(self, other): ...
    def __truediv__(self, other): ...
    def __rtruediv__(self, other): ...
    def __floordiv__(self, other): ...
    def __rfloordiv__(self, other): ...
    def __pow__(self, other): ...
    def __rpow__(self, other): ...
    def __iadd__(self, other): ...
    def __isub__(self, other): ...
    def __imul__(self, other): ...
    def __idiv__(self, other): ...
    def __ifloordiv__(self, other): ...
    def __itruediv__(self, other): ...
    def __ipow__(self, other): ...
    @property  # type: ignore[misc]

Review comment (suggestion):
```pycon
>>> np.ma.array([""]) >= np.ma.array([""])
masked_array(data=[ True],
             mask=False,
       fill_value=True)
>>> np.ma.array([b""]) >= np.ma.array([b""])
masked_array(data=[ True],
             mask=False,
       fill_value=True)
>>> np.ma.array([b""]) >= np.ma.array([""])
Traceback (most recent call last):
  File "<python-input-15>", line 1, in <module>
    np.ma.array([b""]) >= np.ma.array([""])
  File "/home/joren/.pyenv/versions/3.13.3/lib/python3.13/site-packages/numpy/ma/core.py", line 4308, in __ge__
    return self._comparison(other, operator.ge)
           ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/joren/.pyenv/versions/3.13.3/lib/python3.13/site-packages/numpy/ma/core.py", line 4241, in _comparison
    check = compare(sdata, odata)
numpy._core._exceptions._UFuncNoLoopError: ufunc 'greater_equal' did not contain a loop with signature matching types (<class 'numpy.dtypes.BytesDType'>, <class 'numpy.dtypes.StrDType'>) -> None
>>> np.ma.array([""]) >= np.ma.array([""], dtype=np.dtypes.StringDType)
masked_array(data=[ True],
             mask=False,
       fill_value=True)
```

so `dtype[str_] | StringDType, dtype[str_]  | StringDType` and `dtype[bytes_], dtype[bytes_]` will also work, as long as you don't mix `bytes_` and string-y dtypes. 

I didn't check `void` yet, but I'm guessing that `void, void` will also work at runtime.

Code after:
    def compress(self, condition, axis=..., out=...): ...
    def __eq__(self, other): ...
    def __ne__(self, other): ...
    def __ge__(self, other: ArrayLike, /) -> _MaskedArray[bool_]: ...
    def __gt__(self, other: ArrayLike, /) -> _MaskedArray[bool_]: ...
    def __le__(self, other: ArrayLike, /) -> _MaskedArray[bool_]: ...
    def __lt__(self, other: ArrayLike, /) -> _MaskedArray[bool_]: ...
    def __add__(self, other): ...
    def __radd__(self, other): ...
    def __sub__(self, other): ...
    def __rsub__(self, other): ...
    def __mul__(self, other): ...
    def __rmul__(self, other): ...
    def __div__(self, other): ...
    def __truediv__(self, other): ...
    def __rtruediv__(self, other): ...
    def __floordiv__(self, other): ...
    def __rfloordiv__(self, other): ...
    def __pow__(self, other): ...
    def __rpow__(self, other): ...
    def __iadd__(self, other): ...
    def __isub__(self, other): ...
    def __imul__(self, other): ...
    def __idiv__(self, other): ...
    def __ifloordiv__(self, other): ...
    def __itruediv__(self, other): ...
    def __ipow__(self, other): ...
    @property  # type: ignore[misc]
    def imag(self): ...
    get_imag: Any
    @property  # type: ignore[misc]
    def real(self): ...
    get_real: Any
    def count(self, axis=..., keepdims=...): ...
    def ravel(self, order=...): ...
    def reshape(self, *s, **kwargs): ...
    def resize(self, newshape, refcheck=..., order=...): ...
    def put(self, indices, values, mode=...): ...
    def ids(self): ...
    def iscontiguous(self): ...
    def all(self, axis=..., out=..., keepdims=...): ...
    def any(self, axis=..., out=..., keepdims=...): ...
    def nonzero(self): ...
    def trace(self, offset=..., axis1=..., axis2=..., dtype=..., out=...): ...
    def dot(self, b, out=..., strict=...): ...
    def sum(self, axis=..., dtype=..., out=..., keepdims=...): ...
    def cumsum(self, axis=..., dtype=..., out=...): ...
    def prod(self, axis=..., dtype=..., out=..., keepdims=...): ...
    product: Any
    def cumprod(self, axis=..., dtype=..., out=...): ...
    def mean(self, axis=..., dtype=..., out=..., keepdims=...): ...