Skip to content

Commit 2e2d588

Browse files
committed
used flatiter for numpy array
1 parent ce78589 commit 2e2d588

File tree

1 file changed

+37
-38
lines changed

1 file changed

+37
-38
lines changed

pandas/_libs/lib.pyx

+37-38
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)