@@ -6,6 +6,18 @@ from distutils.version import LooseVersion
6
6
7
7
is_numpy_prior_1_6_2 = LooseVersion(np.__version__) < ' 1.6.2'
8
8
9
+ cdef _get_result_array(object obj,
10
+ Py_ssize_t size,
11
+ Py_ssize_t cnt):
12
+
13
+ if isinstance (obj, np.ndarray) \
14
+ or isinstance (obj, list ) and len (obj) == cnt \
15
+ or getattr (obj, ' shape' , None ) == (cnt,):
16
+ raise ValueError (' function does not reduce' )
17
+
18
+ return np.empty(size, dtype = ' O' )
19
+
20
+
9
21
cdef class Reducer:
10
22
'''
11
23
Performs generic reduction operation on a C or Fortran-contiguous ndarray
@@ -124,7 +136,9 @@ cdef class Reducer:
124
136
if hasattr (res,' values' ):
125
137
res = res.values
126
138
if i == 0 :
127
- result = self ._get_result_array(res)
139
+ result = _get_result_array(res,
140
+ self .nresults,
141
+ len (self .dummy))
128
142
it = < flatiter> PyArray_IterNew(result)
129
143
130
144
PyArray_SETITEM(result, PyArray_ITER_DATA(it), res)
@@ -143,17 +157,6 @@ cdef class Reducer:
143
157
144
158
return result
145
159
146
- def _get_result_array (self , object res ):
147
- try :
148
- assert (not isinstance (res, np.ndarray))
149
- assert (not (isinstance (res, list ) and len (res) == len (self .dummy)))
150
-
151
- result = np.empty(self .nresults, dtype = ' O' )
152
- result[0 ] = res
153
- except Exception :
154
- raise ValueError (' function does not reduce' )
155
- return result
156
-
157
160
158
161
cdef class SeriesBinGrouper:
159
162
'''
@@ -257,8 +260,10 @@ cdef class SeriesBinGrouper:
257
260
res = self .f(cached_typ)
258
261
res = _extract_result(res)
259
262
if not initialized:
260
- result = self ._get_result_array(res)
261
263
initialized = 1
264
+ result = _get_result_array(res,
265
+ self .ngroups,
266
+ len (self .dummy_arr))
262
267
263
268
util.assign_value_1d(result, i, res)
264
269
@@ -277,16 +282,6 @@ cdef class SeriesBinGrouper:
277
282
278
283
return result, counts
279
284
280
- def _get_result_array (self , object res ):
281
- try :
282
- assert (not isinstance (res, np.ndarray))
283
- assert (not (isinstance (res, list ) and len (res) == len (self .dummy_arr)))
284
-
285
- result = np.empty(self .ngroups, dtype = ' O' )
286
- except Exception :
287
- raise ValueError (' function does not reduce' )
288
- return result
289
-
290
285
291
286
cdef class SeriesGrouper:
292
287
'''
@@ -388,8 +383,10 @@ cdef class SeriesGrouper:
388
383
res = self .f(cached_typ)
389
384
res = _extract_result(res)
390
385
if not initialized:
391
- result = self ._get_result_array(res)
392
386
initialized = 1
387
+ result = _get_result_array(res,
388
+ self .ngroups,
389
+ len (self .dummy_arr))
393
390
394
391
util.assign_value_1d(result, lab, res)
395
392
counts[lab] = group_size
@@ -410,15 +407,6 @@ cdef class SeriesGrouper:
410
407
411
408
return result, counts
412
409
413
- def _get_result_array (self , object res ):
414
- try :
415
- assert (not isinstance (res, np.ndarray))
416
- assert (not (isinstance (res, list ) and len (res) == len (self .dummy_arr)))
417
-
418
- result = np.empty(self .ngroups, dtype = ' O' )
419
- except Exception :
420
- raise ValueError (' function does not reduce' )
421
- return result
422
410
423
411
cdef inline _extract_result(object res):
424
412
''' extract the result object, it might be a 0-dim ndarray
0 commit comments