ak.num#

Defined in awkward.operations.ak_num on line 24.

ak.num(array, axis=1, *, highlevel=True, behavior=None, attrs=None)#
Parameters:
  • array – Array-like data (anything ak.to_layout recognizes).

  • axis (int or str) – The dimension at which this operation is applied. The outermost dimension is 0, followed by 1, etc., and negative values count backward from the innermost: -1 is the innermost dimension, -2 is the next level up, etc. If a str, it is interpreted as the name of the axis which maps to an int if named axes are present. Named axes are attached to an array using ak.with_named_axis and removed with ak.without_named_axis; also see the Named axes user guide.

  • highlevel (bool) – If True, return an ak.Array; otherwise, return a low-level ak.contents.Content subclass.

  • behavior (None or dict) – Custom ak.behavior for the output array, if high-level.

  • attrs (None or dict) – Custom attributes for the output array, if high-level.

Returns an array of integers specifying the number of elements at a particular level.

For instance, given the following doubly nested array,

>>> array = ak.Array([[[1.1, 2.2, 3.3],
...                    [],
...                    [4.4, 5.5],
...                    [6.6]
...                   ],
...                   [],
...                   [[7.7],
...                    [8.8, 9.9]]
...                   ])

The number of elements in axis=1 is

>>> ak.num(array, axis=1)
<Array [4, 0, 2] type='3 * int64'>

and the number of elements at the next level down, axis=2, is

>>> ak.num(array, axis=2)
<Array [[3, 0, 2, 1], [], [1, 2]] type='3 * var * int64'>

The axis=0 case is special: it returns a scalar, the length of the array.

>>> ak.num(array, axis=0)
3

This function is useful for ensuring that slices do not raise errors. For instance, suppose that we want to select the first element from each of the outermost nested lists of array. One of these lists is empty, so selecting the first element (0) would raise an error. However, if our first selection is ak.num(array) > 0, we are left with only those lists that do have a first element:

>>> array[ak.num(array) > 0, 0]
<Array [[1.1, 2.2, 3.3], [7.7]] type='2 * var * float64'>

To keep a placeholder (None) in each place we do not want to select, consider using ak.mask instead of a ak.Array.__getitem__.

>>> array.mask[ak.num(array) > 0][:, 0]
<Array [[1.1, 2.2, 3.3], None, [7.7]] type='3 * option[var * float64]'>