Skip to content

Commit

Permalink
C++ refactoring: ak.argsort (#1304)
Browse files Browse the repository at this point in the history
* ak.argsort and testing

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fixed issue in argsort

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
ioanaif and pre-commit-ci[bot] authored Feb 22, 2022
1 parent 118305b commit bfe48fd
Show file tree
Hide file tree
Showing 9 changed files with 510 additions and 85 deletions.
2 changes: 1 addition & 1 deletion src/awkward/_v2/contents/listoffsetarray.py
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,7 @@ def _argsort_next(
self_stops.data,
stable,
ascending,
False,
True,
)
)
return ak._v2.contents.NumpyArray(nextcarry, None, None, self._nplike)
Expand Down
84 changes: 41 additions & 43 deletions src/awkward/_v2/operations/structure/ak_argsort.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,46 +7,44 @@

# @ak._v2._connect.numpy.implements("argsort")
def argsort(array, axis=-1, ascending=True, stable=True, highlevel=True, behavior=None):
raise NotImplementedError


# """
# Args:
# array: Data for which to get a sorting index, possibly within nested
# lists.
# axis (int): 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.
# ascending (bool): If True, the first value in each sorted group
# will be smallest, the last value largest; if False, the order
# is from largest to smallest.
# stable (bool): If True, use a stable sorting algorithm (introsort:
# a hybrid of quicksort, heapsort, and insertion sort); if False,
# use a sorting algorithm that is not guaranteed to be stable
# (heapsort).
# highlevel (bool): If True, return an #ak.Array; otherwise, return
# a low-level #ak.layout.Content subclass.
# behavior (None or dict): Custom #ak.behavior for the output array, if
# high-level.

# For example,

# >>> ak.argsort(ak.Array([[7.7, 5.5, 7.7], [], [2.2], [8.8, 2.2]]))
# <Array [[1, 0, 2], [], [0], [1, 0]] type='4 * var * int64'>

# The result of this function can be used to index other arrays with the
# same shape:

# >>> data = ak.Array([[7, 5, 7], [], [2], [8, 2]])
# >>> index = ak.argsort(index)
# >>> index
# <Array [[1, 0, 2], [], [0], [1, 0]] type='4 * var * int64'>
# >>> data[index]
# <Array [[5, 7, 7], [], [2], [2, 8]] type='4 * var * int64'>
# """
# layout = ak._v2.operations.convert.to_layout(
# array, allow_record=False, allow_other=False
# )
# out = layout.argsort(axis, ascending, stable)
# return ak._v2._util.maybe_wrap_like(out, array, behavior, highlevel)

"""
Args:
array: Data for which to get a sorting index, possibly within nested
lists.
axis (int): 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.
ascending (bool): If True, the first value in each sorted group
will be smallest, the last value largest; if False, the order
is from largest to smallest.
stable (bool): If True, use a stable sorting algorithm (introsort:
a hybrid of quicksort, heapsort, and insertion sort); if False,
use a sorting algorithm that is not guaranteed to be stable
(heapsort).
highlevel (bool): If True, return an #ak.Array; otherwise, return
a low-level #ak.layout.Content subclass.
behavior (None or dict): Custom #ak.behavior for the output array, if
high-level.
For example,
>>> ak.argsort(ak.Array([[7.7, 5.5, 7.7], [], [2.2], [8.8, 2.2]]))
<Array [[1, 0, 2], [], [0], [1, 0]] type='4 * var * int64'>
The result of this function can be used to index other arrays with the
same shape:
>>> data = ak.Array([[7, 5, 7], [], [2], [8, 2]])
>>> index = ak.argsort(index)
>>> index
<Array [[1, 0, 2], [], [0], [1, 0]] type='4 * var * int64'>
>>> data[index]
<Array [[5, 7, 7], [], [2], [2, 8]] type='4 * var * int64'>
"""
layout = ak._v2.operations.convert.to_layout(
array, allow_record=False, allow_other=False
)
out = layout.argsort(axis, ascending, stable)
return ak._v2._util.wrap(out, behavior, highlevel)
Loading

0 comments on commit bfe48fd

Please sign in to comment.