@@ -20,7 +20,7 @@ PyDateTime_IMPORT
20
20
21
21
import numpy as np
22
22
cimport numpy as cnp
23
- from numpy cimport (ndarray, PyArray_GETITEM,
23
+ from numpy cimport (ndarray, PyArray_GETITEM, PyArray_Check,
24
24
PyArray_ITER_DATA, PyArray_ITER_NEXT, PyArray_IterNew,
25
25
flatiter, NPY_OBJECT,
26
26
int64_t, float32_t, float64_t,
@@ -2380,53 +2380,84 @@ cdef inline void convert_and_set_item(object item, Py_ssize_t index,
2380
2380
result[index] = item
2381
2381
2382
2382
2383
- cdef inline void put_object_as_unicode(object [:] lst, Py_ssize_t idx,
2383
+ @ cython.wraparound (False )
2384
+ @ cython.boundscheck (False )
2385
+ cdef inline void put_object_as_unicode(list lst, Py_ssize_t idx,
2384
2386
object item):
2385
2387
if not isinstance (item, str ):
2386
2388
item = PyObject_Str(item)
2387
2389
lst[idx] = item
2388
2390
2389
2391
2392
+ @ cython.wraparound (False )
2393
+ @ cython.boundscheck (False )
2390
2394
cpdef object _concat_date_cols(object date_cols,
2391
2395
object keep_trivial_numbers = False ):
2392
2396
cdef:
2393
2397
bint keep_numbers
2394
2398
Py_ssize_t sequence_size, i, j
2395
2399
Py_ssize_t array_size, min_size
2396
- object result
2397
- object separator = " "
2398
- object list_to_join, result_string
2399
- object [:] list_view
2400
2400
object [:] result_view
2401
- object [:] iterator
2402
- object [::] arrays
2401
+ object [:,:] arrays_view
2402
+
2403
+ object [:] obj_iter
2404
+ int64_t[:] int_iter
2405
+ float64_t[:] double_iter
2403
2406
2404
2407
keep_numbers = keep_trivial_numbers
2405
2408
sequence_size = len (date_cols)
2406
2409
2407
2410
if sequence_size == 0 :
2408
2411
result = np.zeros(0 , dtype = object )
2409
2412
elif sequence_size == 1 :
2410
- iterator = date_cols[0 ]
2411
- array_size = len (iterator )
2413
+ array = date_cols[0 ]
2414
+ array_size = len (array )
2412
2415
result = np.zeros(array_size, dtype = object )
2413
2416
result_view = result
2414
- for i in range (array_size):
2415
- convert_and_set_item(iterator[i], i, result_view, keep_numbers)
2417
+ 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 = np.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):
2438
+ convert_and_set_item(item, i, result_view, keep_numbers)
2416
2439
else :
2417
- arrays = date_cols
2418
-
2419
2440
min_size = min ([len (arr) for arr in date_cols])
2441
+
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
+
2420
2453
result = np.zeros(min_size, dtype = object )
2421
2454
result_view = result
2422
2455
2423
- list_to_join = PyList_New(sequence_size)
2424
- list_view = list_to_join
2456
+ list_to_join = [None ] * sequence_size
2425
2457
2426
2458
for i in range (min_size):
2427
2459
for j in range (sequence_size):
2428
- put_object_as_unicode(list_view, j, arrays[j][i])
2429
- result_string = PyUnicode_Join(separator, list_to_join)
2430
- result_view[i] = result_string
2460
+ put_object_as_unicode(list_to_join, j, arrays_view[j, i])
2461
+ result_view[i] = PyUnicode_Join(' ' , list_to_join)
2431
2462
2432
2463
return result
0 commit comments