Source code for pydl.uniq
# Licensed under a 3-clause BSD style license - see LICENSE.rst
# -*- coding: utf-8 -*-
[docs]def uniq(x, index=None):
"""Replicates the IDL ``UNIQ()`` function.
Returns the *subscripts* of the unique elements of an array. The elements
must actually be *sorted* before being passed to this function. This can
be done by sorting `x` explicitly or by passing the array subscripts that
sort `x` as a second parameter.
Parameters
----------
x : array-like
Search this array for unique items.
index : array-like, optional
This array provides the array subscripts that sort `x`.
Returns
-------
array-like
The subscripts of `x` that are the unique elements of `x`.
Notes
-----
Given a sorted array, and assuming that there is a set of
adjacent identical items, ``uniq()`` will return the subscript of the
*last* unique item. This charming feature is retained for
reproducibility.
References
----------
http://www.harrisgeospatial.com/docs/uniq.html
Examples
--------
>>> import numpy as np
>>> from pydl import uniq
>>> data = np.array([ 1, 2, 3, 1, 5, 6, 1, 7, 3, 2, 5, 9, 11, 1 ])
>>> print(uniq(np.sort(data)))
[ 3 5 7 9 10 11 12 13]
"""
from numpy import array, roll
if index is None:
indicies = (x != roll(x, -1)).nonzero()[0]
if indicies.size > 0:
return indicies
else:
return array([x.size - 1, ])
else:
q = x[index]
indicies = (q != roll(q, -1)).nonzero()[0]
if indicies.size > 0:
return index[indicies]
else:
return array([q.size - 1, ], dtype=index.dtype)