@@ -3,6 +3,7 @@ cimport numpy as np
3
3
cimport cython
4
4
import numpy as np
5
5
import sys
6
+ cdef bint PY3 = (sys.version_info[0 ] >= 3 )
6
7
7
8
from numpy cimport *
8
9
@@ -42,7 +43,6 @@ cdef extern from "Python.h":
42
43
Py_ssize_t * start, Py_ssize_t * stop, Py_ssize_t * step,
43
44
Py_ssize_t * slicelength) except - 1
44
45
45
-
46
46
cimport cpython
47
47
48
48
isnan = np.isnan
@@ -1568,62 +1568,65 @@ def get_blkno_indexers(int64_t[:] blknos, bint group=True):
1568
1568
int64_t cur_blkno
1569
1569
Py_ssize_t i, start, stop, n, diff
1570
1570
1571
+ object blkno
1571
1572
list group_order
1572
1573
dict group_slices
1573
1574
int64_t[:] res_view
1574
1575
1575
1576
n = blknos.shape[0 ]
1576
1577
1577
- if n > 0 :
1578
- start = 0
1579
- cur_blkno = blknos[start]
1578
+ if n == 0 :
1579
+ return
1580
1580
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]
1585
1583
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)
1588
1588
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]
1610
1591
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)]
1615
1602
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))
1619
1604
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]
1625
1607
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
1627
1630
1628
1631
1629
1632
@ cython.boundscheck (False )
@@ -1670,7 +1673,7 @@ cpdef slice_canonize(slice s):
1670
1673
Convert slice to canonical bounded form.
1671
1674
"""
1672
1675
cdef:
1673
- Py_ssize_t start, stop, step, length
1676
+ Py_ssize_t start = 0 , stop = 0 , step = 1 , length
1674
1677
1675
1678
if s.step is None :
1676
1679
step = 1
@@ -1727,6 +1730,7 @@ cpdef slice_get_indices_ex(slice slc, Py_ssize_t objlen=PY_SSIZE_T_MAX):
1727
1730
1728
1731
PySlice_GetIndicesEx(< PySliceObject * > slc, objlen,
1729
1732
& start, & stop, & step, & length)
1733
+
1730
1734
return start, stop, step, length
1731
1735
1732
1736
0 commit comments