@@ -106,9 +106,11 @@ def rank_1d_generic(object in_arr):
106
106
107
107
values = np.asarray(in_arr).copy()
108
108
109
- nan_value = np.inf
109
+ if values.dtype != np.object_:
110
+ values = values.astype(' O' )
110
111
111
- mask = isnullobj(values.astype(' O' ))
112
+ nan_value = Infinity() # always greater than everything
113
+ mask = isnullobj(values)
112
114
np.putmask(values, mask, nan_value)
113
115
114
116
n = len (values)
@@ -123,7 +125,7 @@ def rank_1d_generic(object in_arr):
123
125
sum_ranks += i + 1
124
126
dups += 1
125
127
val = util.get_value_at(sorted_data, i)
126
- if val == nan_value:
128
+ if val is nan_value:
127
129
ranks[argsorted[i]] = nan
128
130
continue
129
131
if (i == n - 1 or
@@ -133,6 +135,18 @@ def rank_1d_generic(object in_arr):
133
135
sum_ranks = dups = 0
134
136
return ranks
135
137
138
+ class Infinity (object ):
139
+
140
+ return_false = lambda self , other : False
141
+ return_true = lambda self , other : True
142
+ __lt__ = return_false
143
+ __le__ = return_false
144
+ __eq__ = return_false
145
+ __ne__ = return_true
146
+ __gt__ = return_true
147
+ __ge__ = return_true
148
+ __cmp__ = return_false
149
+
136
150
def rank_2d_generic (object in_arr , axis = 0 ):
137
151
"""
138
152
Fast NaN-friendly version of scipy.stats.rankdata
@@ -154,7 +168,10 @@ def rank_2d_generic(object in_arr, axis=0):
154
168
else :
155
169
values = in_arr.copy()
156
170
157
- nan_value = - np.inf # subtlety, infs are ranked before alphanumeric!
171
+ if values.dtype != np.object_:
172
+ values = values.astype(' O' )
173
+
174
+ nan_value = Infinity() # always greater than everything
158
175
mask = isnullobj2d(values)
159
176
np.putmask(values, mask, nan_value)
160
177
@@ -167,7 +184,7 @@ def rank_2d_generic(object in_arr, axis=0):
167
184
dups = sum_ranks = infs = 0
168
185
for j in range (k):
169
186
val = values[i, j]
170
- if val == nan_value:
187
+ if val is nan_value:
171
188
ranks[i, argsorted[i, j]] = nan
172
189
infs += 1
173
190
continue
0 commit comments