ak.mask ------- .. py:module: ak.mask Defined in `awkward.operations.ak_mask <https://github.com/scikit-hep/awkward/blob/36da52cfa8846355c390beb6555eac1d31c27c26/src/awkward/operations/ak_mask.py>`__ on `line 19 <https://github.com/scikit-hep/awkward/blob/36da52cfa8846355c390beb6555eac1d31c27c26/src/awkward/operations/ak_mask.py#L19>`__. .. py:function:: ak.mask(array, mask, *, valid_when=True, highlevel=True, behavior=None, attrs=None) :param array: Array-like data (anything :py:obj:`ak.to_layout` recognizes). :param mask: The mask that overlays elements in the ``array`` with None. Must have the same length as ``array``. :type mask: array of booleans :param valid_when: If True, True values in ``mask`` are considered valid (passed from ``array`` to the output); if False, False values in ``mask`` are considered valid. :type valid_when: bool :param highlevel: If True, return an :py:obj:`ak.Array`; otherwise, return a low-level :py:obj:`ak.contents.Content` subclass. :type highlevel: bool :param behavior: Custom :py:obj:`ak.behavior` for the output array, if high-level. :type behavior: None or dict :param attrs: Custom attributes for the output array, if high-level. :type attrs: None or dict Returns an array for which .. code-block:: python output[i] = array[i] if mask[i] == valid_when else None Unlike filtering data with :py:obj:`ak.Array.__getitem__`, this ``output`` has the same length as the original ``array`` and can therefore be used in calculations with it, such as `universal functions <https://docs.scipy.org/doc/numpy/reference/ufuncs.html>`__. For example, with .. code-block:: python >>> array = ak.Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) with a boolean selection of ``good`` elements like .. code-block:: python >>> good = (array % 2 == 1) >>> good <Array [False, True, False, True, ..., True, False, True] type='10 * bool'> could be used to filter the original ``array`` (or another with the same length). .. code-block:: python >>> array[good] <Array [1, 3, 5, 7, 9] type='5 * int64'> However, this eliminates information about which elements were dropped and where they were. If we instead use :py:obj:`ak.mask`, .. code-block:: python >>> ak.mask(array, good) <Array [None, 1, None, 3, None, 5, None, 7, None, 9] type='10 * ?int64'> this information and the length of the array is preserved, and it can be used in further calculations with the original ``array`` (or another with the same length). .. code-block:: python >>> ak.mask(array, good) + array <Array [None, 2, None, 6, None, 10, None, 14, None, 18] type='10 * ?int64'> In particular, successive filters can be applied to the same array. Even if the ``array`` and/or the ``mask`` is nested, .. code-block:: python >>> array = ak.Array([[[0, 1, 2], [], [3, 4], [5]], [[6, 7, 8], [9]]]) >>> good = (array % 2 == 1) >>> good <Array [[[False, True, False], ..., [True]], ...] type='2 * var * var * bool'> it can still be used with :py:obj:`ak.mask` because the ``array`` and ``mask`` parameters are broadcasted. .. code-block:: python >>> ak.mask(array, good) <Array [[[None, 1, None], [], ..., [5]], ...] type='2 * var * var * ?int64'> See :py:obj:`ak.broadcast_arrays` for details about broadcasting and the generalized set of broadcasting rules. Another syntax for .. code-block:: python ak.mask(array, array_of_booleans) is .. code-block:: python array.mask[array_of_booleans] (which is 5 characters away from simply filtering the ``array``).