@@ -379,28 +379,34 @@ ctypedef fused algos_t:
379
379
uint8_t
380
380
381
381
382
+ def _validate_limit (nobs: int , limit = None ) -> int:
383
+ if limit is None:
384
+ lim = nobs
385
+ else:
386
+ if not util.is_integer_object(limit ):
387
+ raise ValueError (' Limit must be an integer' )
388
+ if limit < 1 :
389
+ raise ValueError (' Limit must be greater than 0' )
390
+ lim = limit
391
+
392
+ return lim
393
+
394
+
382
395
@ cython.boundscheck (False )
383
396
@ cython.wraparound (False )
384
397
def pad (ndarray[algos_t] old , ndarray[algos_t] new , limit = None ):
385
398
cdef:
386
399
Py_ssize_t i, j, nleft, nright
387
400
ndarray[int64_t, ndim= 1 ] indexer
388
- algos_t cur, next
401
+ algos_t cur, next_val
389
402
int lim, fill_count = 0
390
403
391
404
nleft = len (old)
392
405
nright = len (new)
393
406
indexer = np.empty(nright, dtype = np.int64)
394
407
indexer[:] = - 1
395
408
396
- if limit is None :
397
- lim = nright
398
- else :
399
- if not util.is_integer_object(limit):
400
- raise ValueError (' Limit must be an integer' )
401
- if limit < 1 :
402
- raise ValueError (' Limit must be greater than 0' )
403
- lim = limit
409
+ lim = _validate_limit(nright, limit)
404
410
405
411
if nleft == 0 or nright == 0 or new[nright - 1 ] < old[0 ]:
406
412
return indexer
@@ -426,9 +432,9 @@ def pad(ndarray[algos_t] old, ndarray[algos_t] new, limit=None):
426
432
j += 1
427
433
break
428
434
429
- next = old[i + 1 ]
435
+ next_val = old[i + 1 ]
430
436
431
- while j < nright and cur <= new[j] < next :
437
+ while j < nright and cur <= new[j] < next_val :
432
438
if new[j] == cur:
433
439
indexer[j] = i
434
440
elif fill_count < lim:
@@ -438,16 +444,14 @@ def pad(ndarray[algos_t] old, ndarray[algos_t] new, limit=None):
438
444
439
445
fill_count = 0
440
446
i += 1
441
- cur = next
447
+ cur = next_val
442
448
443
449
return indexer
444
450
445
451
446
452
@ cython.boundscheck (False )
447
453
@ cython.wraparound (False )
448
- def pad_inplace (algos_t[:] values ,
449
- const uint8_t[:] mask ,
450
- limit = None ):
454
+ def pad_inplace (algos_t[:] values , const uint8_t[:] mask , limit = None ):
451
455
cdef:
452
456
Py_ssize_t i, N
453
457
algos_t val
@@ -459,14 +463,7 @@ def pad_inplace(algos_t[:] values,
459
463
if N == 0 :
460
464
return
461
465
462
- if limit is None :
463
- lim = N
464
- else :
465
- if not util.is_integer_object(limit):
466
- raise ValueError (' Limit must be an integer' )
467
- if limit < 1 :
468
- raise ValueError (' Limit must be greater than 0' )
469
- lim = limit
466
+ lim = _validate_limit(N, limit)
470
467
471
468
val = values[0 ]
472
469
for i in range (N):
@@ -482,9 +479,7 @@ def pad_inplace(algos_t[:] values,
482
479
483
480
@ cython.boundscheck (False )
484
481
@ cython.wraparound (False )
485
- def pad_2d_inplace (algos_t[:, :] values ,
486
- const uint8_t[:, :] mask ,
487
- limit = None ):
482
+ def pad_2d_inplace (algos_t[:, :] values , const uint8_t[:, :] mask , limit = None ):
488
483
cdef:
489
484
Py_ssize_t i, j, N, K
490
485
algos_t val
@@ -496,14 +491,7 @@ def pad_2d_inplace(algos_t[:, :] values,
496
491
if N == 0 :
497
492
return
498
493
499
- if limit is None :
500
- lim = N
501
- else :
502
- if not util.is_integer_object(limit):
503
- raise ValueError (' Limit must be an integer' )
504
- if limit < 1 :
505
- raise ValueError (' Limit must be greater than 0' )
506
- lim = limit
494
+ lim = _validate_limit(N, limit)
507
495
508
496
for j in range (K):
509
497
fill_count = 0
@@ -559,14 +547,7 @@ def backfill(ndarray[algos_t] old, ndarray[algos_t] new, limit=None):
559
547
indexer = np.empty(nright, dtype = np.int64)
560
548
indexer[:] = - 1
561
549
562
- if limit is None :
563
- lim = nright
564
- else :
565
- if not util.is_integer_object(limit):
566
- raise ValueError (' Limit must be an integer' )
567
- if limit < 1 :
568
- raise ValueError (' Limit must be greater than 0' )
569
- lim = limit
550
+ lim = _validate_limit(nright, limit)
570
551
571
552
if nleft == 0 or nright == 0 or new[0 ] > old[nleft - 1 ]:
572
553
return indexer
@@ -612,9 +593,7 @@ def backfill(ndarray[algos_t] old, ndarray[algos_t] new, limit=None):
612
593
613
594
@ cython.boundscheck (False )
614
595
@ cython.wraparound (False )
615
- def backfill_inplace (algos_t[:] values ,
616
- const uint8_t[:] mask ,
617
- limit = None ):
596
+ def backfill_inplace (algos_t[:] values , const uint8_t[:] mask , limit = None ):
618
597
cdef:
619
598
Py_ssize_t i, N
620
599
algos_t val
@@ -626,14 +605,7 @@ def backfill_inplace(algos_t[:] values,
626
605
if N == 0 :
627
606
return
628
607
629
- if limit is None :
630
- lim = N
631
- else :
632
- if not util.is_integer_object(limit):
633
- raise ValueError (' Limit must be an integer' )
634
- if limit < 1 :
635
- raise ValueError (' Limit must be greater than 0' )
636
- lim = limit
608
+ lim = _validate_limit(N, limit)
637
609
638
610
val = values[N - 1 ]
639
611
for i in range (N - 1 , - 1 , - 1 ):
@@ -663,14 +635,7 @@ def backfill_2d_inplace(algos_t[:, :] values,
663
635
if N == 0 :
664
636
return
665
637
666
- if limit is None :
667
- lim = N
668
- else :
669
- if not util.is_integer_object(limit):
670
- raise ValueError (' Limit must be an integer' )
671
- if limit < 1 :
672
- raise ValueError (' Limit must be greater than 0' )
673
- lim = limit
638
+ lim = _validate_limit(N, limit)
674
639
675
640
for j in range (K):
676
641
fill_count = 0
0 commit comments