@@ -104,23 +104,21 @@ def rank_1d_{{dtype}}(object in_arr, ties_method='average', ascending=True,
104
104
try:
105
105
# lexsort on object array will raise TypeError for numpy version
106
106
# earlier than 1.11.0
107
- _dt = [('values', 'object'), ('mask', 'bool')]
108
- _values = np.asarray(list(zip(mask, values)), dtype=_dt)
109
- if ascending ^ (na_option == 'top'):
110
- _values = np.asarray(list(zip(values, mask)), dtype=_dt)
111
- else:
112
- _values = np.asarray(list(zip(values, (~mask))), dtype=_dt)
113
- _as = np.argsort(_values, kind='mergesort', order=('mask', 'values'))
107
+ _as = np.lexsort(keys=(mask, values))
114
108
except TypeError:
115
- if not retry:
116
- raise
117
-
118
- valid_locs = (~mask).nonzero()[0]
119
- ranks.put(valid_locs, rank_1d_object(values.take(valid_locs), 0,
120
- ties_method=ties_method,
121
- ascending=ascending))
122
- np.putmask(ranks, mask, np.nan)
123
- return ranks
109
+ try:
110
+ _dt = [('values', 'O'), ('mask', '?')]
111
+ _values = np.asarray(list(zip(values, mask)), dtype=_dt)
112
+ _as = np.argsort(_values, kind='mergesort', order=('values', 'mask'))
113
+ except TypeError:
114
+ if not retry:
115
+ raise
116
+ valid_locs = (~mask).nonzero()[0]
117
+ ranks.put(valid_locs, rank_1d_object(values.take(valid_locs), 0,
118
+ ties_method=ties_method,
119
+ ascending=ascending))
120
+ np.putmask(ranks, mask, np.nan)
121
+ return ranks
124
122
{{else}}
125
123
if tiebreak == TIEBREAK_FIRST:
126
124
# need to use a stable sort here
0 commit comments