@@ -3,6 +3,7 @@ cimport numpy as np
33cimport cython
44import numpy as np
55import sys
6+ cdef bint PY3 = (sys.version_info[0 ] >= 3 )
67
78from numpy cimport *
89
@@ -42,7 +43,6 @@ cdef extern from "Python.h":
4243 Py_ssize_t * start, Py_ssize_t * stop, Py_ssize_t * step,
4344 Py_ssize_t * slicelength) except - 1
4445
45-
4646cimport cpython
4747
4848isnan = np.isnan
@@ -1568,62 +1568,65 @@ def get_blkno_indexers(int64_t[:] blknos, bint group=True):
15681568 int64_t cur_blkno
15691569 Py_ssize_t i, start, stop, n, diff
15701570
1571+ object blkno
15711572 list group_order
15721573 dict group_slices
15731574 int64_t[:] res_view
15741575
15751576 n = blknos.shape[0 ]
15761577
1577- if n > 0 :
1578- start = 0
1579- cur_blkno = blknos[start]
1578+ if n == 0 :
1579+ return
15801580
1581- if group == False :
1582- for i in range (1 , n):
1583- if blknos[i] != cur_blkno:
1584- yield cur_blkno, slice (start, i)
1581+ start = 0
1582+ cur_blkno = blknos[start]
15851583
1586- start = i
1587- cur_blkno = blknos[i]
1584+ if group == False :
1585+ for i in range (1 , n):
1586+ if blknos[i] != cur_blkno:
1587+ yield cur_blkno, slice (start, i)
15881588
1589- yield cur_blkno, slice (start, n)
1590- else :
1591- group_order = []
1592- group_dict = {}
1593-
1594- for i in range (1 , n):
1595- if blknos[i] != cur_blkno:
1596- if cur_blkno not in group_dict:
1597- group_order.append(cur_blkno)
1598- group_dict[cur_blkno] = [(start, i)]
1599- else :
1600- group_dict[cur_blkno].append((start, i))
1601-
1602- start = i
1603- cur_blkno = blknos[i]
1604-
1605- if cur_blkno not in group_dict:
1606- group_order.append(cur_blkno)
1607- group_dict[cur_blkno] = [(start, n)]
1608- else :
1609- group_dict[cur_blkno].append((start, n))
1589+ start = i
1590+ cur_blkno = blknos[i]
16101591
1611- for blkno in group_order:
1612- slices = group_dict[blkno]
1613- if len (slices) == 1 :
1614- yield blkno, slice (slices[0 ][0 ], slices[0 ][1 ])
1592+ yield cur_blkno, slice (start, n)
1593+ else :
1594+ group_order = []
1595+ group_dict = {}
1596+
1597+ for i in range (1 , n):
1598+ if blknos[i] != cur_blkno:
1599+ if cur_blkno not in group_dict:
1600+ group_order.append(cur_blkno)
1601+ group_dict[cur_blkno] = [(start, i)]
16151602 else :
1616- tot_len = sum (stop - start for start, stop in slices)
1617- result = np.empty(tot_len, dtype = np.int64)
1618- res_view = result
1603+ group_dict[cur_blkno].append((start, i))
16191604
1620- i = 0
1621- for start, stop in slices:
1622- for diff in range (start, stop):
1623- res_view[i] = diff
1624- i += 1
1605+ start = i
1606+ cur_blkno = blknos[i]
16251607
1626- yield blkno, result
1608+ if cur_blkno not in group_dict:
1609+ group_order.append(cur_blkno)
1610+ group_dict[cur_blkno] = [(start, n)]
1611+ else :
1612+ group_dict[cur_blkno].append((start, n))
1613+
1614+ for blkno in group_order:
1615+ slices = group_dict[blkno]
1616+ if len (slices) == 1 :
1617+ yield blkno, slice (slices[0 ][0 ], slices[0 ][1 ])
1618+ else :
1619+ tot_len = sum ([stop - start for start, stop in slices])
1620+ result = np.empty(tot_len, dtype = np.int64)
1621+ res_view = result
1622+
1623+ i = 0
1624+ for start, stop in slices:
1625+ for diff in range (start, stop):
1626+ res_view[i] = diff
1627+ i += 1
1628+
1629+ yield blkno, result
16271630
16281631
16291632@ cython.boundscheck (False )
@@ -1670,7 +1673,7 @@ cpdef slice_canonize(slice s):
16701673 Convert slice to canonical bounded form.
16711674 """
16721675 cdef:
1673- Py_ssize_t start, stop, step, length
1676+ Py_ssize_t start = 0 , stop = 0 , step = 1 , length
16741677
16751678 if s.step is None :
16761679 step = 1
@@ -1727,6 +1730,7 @@ cpdef slice_get_indices_ex(slice slc, Py_ssize_t objlen=PY_SSIZE_T_MAX):
17271730
17281731 PySlice_GetIndicesEx(< PySliceObject * > slc, objlen,
17291732 & start, & stop, & step, & length)
1733+
17301734 return start, stop, step, length
17311735
17321736
0 commit comments