@@ -17,7 +17,7 @@ dtypes = [('Complex128', 'complex128', 'complex128',
17
17
('UInt32', 'uint32', 'uint32', 'uint32_t', ''),
18
18
('UInt16', 'uint16', 'uint16', 'uint16_t', ''),
19
19
('UInt8', 'uint8', 'uint8', 'uint8_t', ''),
20
- ('Object', 'object', 'pymap', 'object', ''),
20
+ ('Object', 'object', 'pymap', 'object', '<PyObject*> '),
21
21
('Int64', 'int64', 'int64', 'int64_t', ''),
22
22
('Int32', 'int32', 'int32', 'int32_t', ''),
23
23
('Int16', 'int16', 'int16', 'int16_t', ''),
@@ -61,11 +61,11 @@ cdef value_count_{{dtype}}(const {{dtype}}_t[:] values, bint dropna):
61
61
for i in range(n):
62
62
val = values[i]
63
63
if not dropna or not checknull(val):
64
- k = kh_get_{{ttype}}(table, <PyObject*> val)
64
+ k = kh_get_{{ttype}}(table, {{to_c_type}} val)
65
65
if k != table.n_buckets:
66
66
table.vals[k] += 1
67
67
else:
68
- k = kh_put_{{ttype}}(table, <PyObject*> val, &ret)
68
+ k = kh_put_{{ttype}}(table, {{to_c_type}} val, &ret)
69
69
table.vals[k] = 1
70
70
result_keys.append(val)
71
71
{{else}}
@@ -110,6 +110,8 @@ cdef duplicated_{{dtype}}(const {{dtype}}_t[:] values, object keep='first'):
110
110
int ret = 0
111
111
{{if dtype != 'object'}}
112
112
{{c_type}} value
113
+ {{else}}
114
+ PyObject* value
113
115
{{endif}}
114
116
Py_ssize_t i, n = len(values)
115
117
khiter_t k
@@ -123,44 +125,33 @@ cdef duplicated_{{dtype}}(const {{dtype}}_t[:] values, object keep='first'):
123
125
124
126
if keep == 'last':
125
127
{{if dtype == 'object'}}
126
- for i in range(n - 1, -1, -1):
127
- # equivalent: range(n)[::-1], which cython doesn't like in nogil
128
- kh_put_{{ttype}}(table, <PyObject*>values[i], &ret)
129
- out[i] = ret == 0
128
+ if True:
130
129
{{else}}
131
130
with nogil:
131
+ {{endif}}
132
132
for i in range(n - 1, -1, -1):
133
133
# equivalent: range(n)[::-1], which cython doesn't like in nogil
134
134
value = {{to_c_type}}(values[i])
135
135
kh_put_{{ttype}}(table, value, &ret)
136
136
out[i] = ret == 0
137
- {{endif}}
137
+
138
138
elif keep == 'first':
139
139
{{if dtype == 'object'}}
140
- for i in range(n):
141
- kh_put_{{ttype}}(table, <PyObject*>values[i], &ret)
142
- out[i] = ret == 0
140
+ if True:
143
141
{{else}}
144
142
with nogil:
143
+ {{endif}}
145
144
for i in range(n):
146
145
value = {{to_c_type}}(values[i])
147
146
kh_put_{{ttype}}(table, value, &ret)
148
147
out[i] = ret == 0
149
- {{endif}}
148
+
150
149
else:
151
150
{{if dtype == 'object'}}
152
- for i in range(n):
153
- value = values[i]
154
- k = kh_get_{{ttype}}(table, <PyObject*>value)
155
- if k != table.n_buckets:
156
- out[table.vals[k]] = 1
157
- out[i] = 1
158
- else:
159
- k = kh_put_{{ttype}}(table, <PyObject*>value, &ret)
160
- table.vals[k] = i
161
- out[i] = 0
151
+ if True:
162
152
{{else}}
163
153
with nogil:
154
+ {{endif}}
164
155
for i in range(n):
165
156
value = {{to_c_type}}(values[i])
166
157
k = kh_get_{{ttype}}(table, value)
@@ -171,7 +162,7 @@ cdef duplicated_{{dtype}}(const {{dtype}}_t[:] values, object keep='first'):
171
162
k = kh_put_{{ttype}}(table, value, &ret)
172
163
table.vals[k] = i
173
164
out[i] = 0
174
- {{endif}}
165
+
175
166
kh_destroy_{{ttype}}(table)
176
167
return out
177
168
@@ -206,39 +197,41 @@ cdef ismember_{{dtype}}(const {{dtype}}_t[:] arr, const {{dtype}}_t[:] values):
206
197
khiter_t k
207
198
int ret = 0
208
199
ndarray[uint8_t] result
200
+
201
+ {{if dtype == "object"}}
202
+ PyObject* val
203
+ {{else}}
209
204
{{c_type}} val
205
+ {{endif}}
206
+
210
207
kh_{{ttype}}_t *table = kh_init_{{ttype}}()
211
208
212
209
# construct the table
213
210
n = len(values)
214
211
kh_resize_{{ttype}}(table, n)
215
212
216
213
{{if dtype == 'object'}}
217
- for i in range(n):
218
- kh_put_{{ttype}}(table, <PyObject*>values[i], &ret)
214
+ if True:
219
215
{{else}}
220
216
with nogil:
217
+ {{endif}}
221
218
for i in range(n):
222
219
val = {{to_c_type}}(values[i])
223
220
kh_put_{{ttype}}(table, val, &ret)
224
- {{endif}}
225
221
226
222
# test membership
227
223
n = len(arr)
228
224
result = np.empty(n, dtype=np.uint8)
229
225
230
226
{{if dtype == 'object'}}
231
- for i in range(n):
232
- val = arr[i]
233
- k = kh_get_{{ttype}}(table, <PyObject*>val)
234
- result[i] = (k != table.n_buckets)
227
+ if True:
235
228
{{else}}
236
229
with nogil:
230
+ {{endif}}
237
231
for i in range(n):
238
232
val = {{to_c_type}}(arr[i])
239
233
k = kh_get_{{ttype}}(table, val)
240
234
result[i] = (k != table.n_buckets)
241
- {{endif}}
242
235
243
236
kh_destroy_{{ttype}}(table)
244
237
return result.view(np.bool_)
0 commit comments