@@ -2391,18 +2391,22 @@ cdef inline void put_object_as_unicode(list lst, Py_ssize_t idx,
2391
2391
2392
2392
@ cython.wraparound (False )
2393
2393
@ cython.boundscheck (False )
2394
- cpdef object _concat_date_cols(object date_cols,
2394
+ cpdef object _concat_date_cols(tuple date_cols,
2395
2395
object keep_trivial_numbers = False ):
2396
2396
cdef:
2397
2397
bint keep_numbers
2398
2398
Py_ssize_t sequence_size, i, j
2399
- Py_ssize_t array_size, min_size
2399
+ Py_ssize_t array_size, min_size = 0
2400
2400
object [:] result_view
2401
2401
object [:,:] arrays_view
2402
2402
2403
- object [:] obj_iter
2404
- int64_t[:] int_iter
2405
- float64_t[:] double_iter
2403
+ flatiter it
2404
+ int all_numpy = 1
2405
+ cnp.ndarray[object ] iters
2406
+ object [::1 ] iters_view
2407
+ object array
2408
+ list list_to_join
2409
+
2406
2410
2407
2411
keep_numbers = keep_trivial_numbers
2408
2412
sequence_size = len (date_cols)
@@ -2415,49 +2419,44 @@ cpdef object _concat_date_cols(object date_cols,
2415
2419
result = np.zeros(array_size, dtype = object )
2416
2420
result_view = result
2417
2421
if PyArray_Check(array):
2418
- if array.dtype == np.int64:
2419
- int_iter = array
2420
- for i in range (array_size):
2421
- convert_and_set_item(int_iter[i], i,
2422
- result_view, keep_numbers)
2423
- elif array.dtype == np.float64:
2424
- double_iter = array
2425
- for i in range (array_size):
2426
- convert_and_set_item(double_iter[i], i,
2427
- result_view, keep_numbers)
2428
- else :
2429
- if array.dtype == object :
2430
- obj_iter = array
2431
- else :
2432
- obj_array = array.astype(object )
2433
- obj_iter = obj_array
2434
- for i in range (array_size):
2435
- convert_and_set_item(obj_iter[i], i, result_view, keep_numbers)
2436
- else :
2437
- for i, item in enumerate (array):
2422
+ it = < flatiter> PyArray_IterNew(array)
2423
+ for i in range (array_size):
2424
+ item = PyArray_GETITEM(array, PyArray_ITER_DATA(it))
2438
2425
convert_and_set_item(item, i, result_view, keep_numbers)
2426
+ PyArray_ITER_NEXT(it)
2427
+ else :
2428
+ for i in range (array_size):
2429
+ convert_and_set_item(array[i], i, result_view, keep_numbers)
2439
2430
else :
2440
- min_size = min ([len (arr) for arr in date_cols])
2431
+ for i in range (sequence_size):
2432
+ array = date_cols[i]
2433
+ if not PyArray_Check(array):
2434
+ all_numpy = 0
2435
+ if len (array) < min_size or min_size == 0 :
2436
+ min_size = len (array)
2437
+
2438
+ if all_numpy:
2439
+ iters = np.zeros(sequence_size, dtype = object )
2440
+ iters_view = iters
2441
+ for i in range (sequence_size):
2442
+ iters_view[i] = PyArray_IterNew(date_cols[i])
2441
2443
2442
- arrays = np.zeros((len (date_cols), min_size), dtype = object )
2443
- for idx, array in enumerate (date_cols):
2444
- if PyArray_Check(array):
2445
- if array.dtype == object :
2446
- arrays[idx] = array
2447
- else :
2448
- arrays[idx] = array.astype(object )
2449
- else :
2450
- arrays[idx] = np.array(array, dtype = object )
2451
- arrays_view = arrays
2452
2444
2453
2445
result = np.zeros(min_size, dtype = object )
2454
2446
result_view = result
2455
2447
2456
2448
list_to_join = [None ] * sequence_size
2457
2449
2458
2450
for i in range (min_size):
2459
- for j in range (sequence_size):
2460
- put_object_as_unicode(list_to_join, j, arrays_view[j, i])
2451
+ if all_numpy:
2452
+ for j in range (sequence_size):
2453
+ it = < flatiter> iters_view[j]
2454
+ item = PyArray_GETITEM(date_cols[j], PyArray_ITER_DATA(it))
2455
+ put_object_as_unicode(list_to_join, j, item)
2456
+ PyArray_ITER_NEXT(it)
2457
+ else :
2458
+ for j in range (sequence_size):
2459
+ put_object_as_unicode(list_to_join, j, date_cols[j][i])
2461
2460
result_view[i] = PyUnicode_Join(' ' , list_to_join)
2462
2461
2463
2462
return result
0 commit comments