@@ -2391,18 +2391,22 @@ cdef inline void put_object_as_unicode(list lst, Py_ssize_t idx,
23912391
23922392@ cython.wraparound (False )
23932393@ cython.boundscheck (False )
2394- cpdef object _concat_date_cols(object date_cols,
2394+ cpdef object _concat_date_cols(tuple date_cols,
23952395 object keep_trivial_numbers = False ):
23962396 cdef:
23972397 bint keep_numbers
23982398 Py_ssize_t sequence_size, i, j
2399- Py_ssize_t array_size, min_size
2399+ Py_ssize_t array_size, min_size = 0
24002400 object [:] result_view
24012401 object [:,:] arrays_view
24022402
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+
24062410
24072411 keep_numbers = keep_trivial_numbers
24082412 sequence_size = len (date_cols)
@@ -2415,49 +2419,44 @@ cpdef object _concat_date_cols(object date_cols,
24152419 result = np.zeros(array_size, dtype = object )
24162420 result_view = result
24172421 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))
24382425 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)
24392430 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])
24412443
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
24522444
24532445 result = np.zeros(min_size, dtype = object )
24542446 result_view = result
24552447
24562448 list_to_join = [None ] * sequence_size
24572449
24582450 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])
24612460 result_view[i] = PyUnicode_Join(' ' , list_to_join)
24622461
24632462 return result
0 commit comments