@@ -101,10 +101,10 @@ def rank_1d_generic(object in_arr):
101
101
ndarray sorted_data, values
102
102
ndarray[int64_t] argsorted
103
103
int32_t idx
104
- float64_t val, nan_value
104
+ object val, nan_value
105
105
float64_t sum_ranks = 0
106
106
107
- values = np.asarray (in_arr). copy( )
107
+ values = np.array (in_arr, copy = True )
108
108
109
109
if values.dtype != np.object_:
110
110
values = values.astype(' O' )
@@ -117,7 +117,14 @@ def rank_1d_generic(object in_arr):
117
117
ranks = np.empty(n, dtype = ' f8' )
118
118
119
119
# py2.5/win32 hack, can't pass i8
120
- _as = values.argsort()
120
+ try :
121
+ _as = values.argsort()
122
+ except TypeError :
123
+ valid_locs = (- mask).nonzero()[0 ]
124
+ ranks.put(valid_locs, rank_1d_generic(values.take(valid_locs)))
125
+ np.putmask(ranks, mask, np.nan)
126
+ return ranks
127
+
121
128
sorted_data = values.take(_as)
122
129
argsorted = _as.astype(' i8' )
123
130
@@ -129,12 +136,18 @@ def rank_1d_generic(object in_arr):
129
136
ranks[argsorted[i]] = nan
130
137
continue
131
138
if (i == n - 1 or
132
- fabs (util.get_value_at(sorted_data, i + 1 ) - val) > FP_ERR ):
139
+ are_diff (util.get_value_at(sorted_data, i + 1 ), val)):
133
140
for j in range (i - dups + 1 , i + 1 ):
134
141
ranks[argsorted[j]] = sum_ranks / dups
135
142
sum_ranks = dups = 0
136
143
return ranks
137
144
145
+ cdef inline are_diff(object left, object right):
146
+ try :
147
+ return fabs(left - right) > FP_ERR
148
+ except TypeError :
149
+ return left != right
150
+
138
151
class Infinity (object ):
139
152
140
153
return_false = lambda self , other : False
@@ -177,7 +190,18 @@ def rank_2d_generic(object in_arr, axis=0):
177
190
178
191
n, k = (< object > values).shape
179
192
ranks = np.empty((n, k), dtype = ' f8' )
180
- argsorted = values.argsort(1 ).astype(' i8' )
193
+
194
+ try :
195
+ argsorted = values.argsort(1 ).astype(' i8' )
196
+ except TypeError :
197
+ values = in_arr
198
+ for i in range (len (values)):
199
+ ranks[i] = rank_1d_generic(in_arr[i])
200
+ if axis == 0 :
201
+ return ranks.T
202
+ else :
203
+ return ranks
204
+
181
205
values.sort(axis = 1 )
182
206
183
207
for i in range (n):
@@ -190,7 +214,7 @@ def rank_2d_generic(object in_arr, axis=0):
190
214
continue
191
215
sum_ranks += (j - infs) + 1
192
216
dups += 1
193
- if j == k - 1 or values[i, j + 1 ] ! = val:
217
+ if j == k - 1 or are_diff( values[i, j + 1 ], val) :
194
218
for z in range (j - dups + 1 , j + 1 ):
195
219
ranks[i, argsorted[i, z]] = sum_ranks / dups
196
220
sum_ranks = dups = 0
0 commit comments