@@ -802,6 +802,7 @@ def _combine(
802
802
return type (self ).from_blocks (new_blocks , axes )
803
803
804
804
def get_slice (self , slobj : slice , axis : int = 0 ) -> BlockManager :
805
+ assert isinstance (slobj , slice ), type (slobj )
805
806
806
807
if axis == 0 :
807
808
new_blocks = self ._slice_take_blocks_ax0 (slobj )
@@ -812,7 +813,7 @@ def get_slice(self, slobj: slice, axis: int = 0) -> BlockManager:
812
813
raise IndexError ("Requested axis not found in manager" )
813
814
814
815
new_axes = list (self .axes )
815
- new_axes [axis ] = new_axes [axis ][ slobj ]
816
+ new_axes [axis ] = new_axes [axis ]. _getitem_slice ( slobj )
816
817
817
818
return type (self )._simple_new (tuple (new_blocks ), new_axes )
818
819
@@ -1201,15 +1202,17 @@ def value_getitem(placement):
1201
1202
# Newly created block's dtype may already be present.
1202
1203
self ._known_consolidated = False
1203
1204
1204
- def insert (self , loc : int , item : Hashable , value , allow_duplicates : bool = False ):
1205
+ def insert (
1206
+ self , loc : int , item : Hashable , value : ArrayLike , allow_duplicates : bool = False
1207
+ ):
1205
1208
"""
1206
1209
Insert item at selected position.
1207
1210
1208
1211
Parameters
1209
1212
----------
1210
1213
loc : int
1211
1214
item : hashable
1212
- value : array_like
1215
+ value : np.ndarray or ExtensionArray
1213
1216
allow_duplicates: bool
1214
1217
If False, trying to insert non-unique item will raise
1215
1218
@@ -1226,11 +1229,9 @@ def insert(self, loc: int, item: Hashable, value, allow_duplicates: bool = False
1226
1229
1227
1230
if value .ndim == 2 :
1228
1231
value = value .T
1229
- elif value .ndim == self .ndim - 1 :
1230
- # TODO(EA2D): special case not needed with 2D EAs
1231
- value = ensure_block_shape (value , ndim = 2 )
1232
+ else :
1233
+ value = ensure_block_shape (value , ndim = self .ndim )
1232
1234
1233
- # TODO: type value as ArrayLike
1234
1235
block = new_block (values = value , ndim = self .ndim , placement = slice (loc , loc + 1 ))
1235
1236
1236
1237
for blkno , count in _fast_count_smallints (self .blknos [loc :]):
@@ -1367,6 +1368,7 @@ def _slice_take_blocks_ax0(
1367
1368
# TODO(EA2D): special casing unnecessary with 2D EAs
1368
1369
if sllen == 0 :
1369
1370
return []
1371
+ # TODO: tests all have isinstance(slobj, slice), other possibilities?
1370
1372
return [blk .getitem_block (slobj , new_mgr_locs = slice (0 , sllen ))]
1371
1373
elif not allow_fill or self .ndim == 1 :
1372
1374
if allow_fill and fill_value is None :
@@ -1376,9 +1378,11 @@ def _slice_take_blocks_ax0(
1376
1378
# GH#33597 slice instead of take, so we get
1377
1379
# views instead of copies
1378
1380
blocks = [
1379
- blk .getitem_block ([ ml ] , new_mgr_locs = i )
1381
+ blk .getitem_block (slice ( ml , ml + 1 ) , new_mgr_locs = i )
1380
1382
for i , ml in enumerate (slobj )
1381
1383
]
1384
+ # We have
1385
+ # all(np.shares_memory(nb.values, blk.values) for nb in blocks)
1382
1386
return blocks
1383
1387
else :
1384
1388
return [
@@ -1440,7 +1444,8 @@ def _slice_take_blocks_ax0(
1440
1444
# GH#33597 slice instead of take, so we get
1441
1445
# views instead of copies
1442
1446
for i , ml in zip (taker , mgr_locs ):
1443
- nb = blk .getitem_block ([i ], new_mgr_locs = ml )
1447
+ nb = blk .getitem_block (slice (i , i + 1 ), new_mgr_locs = ml )
1448
+ # We have np.shares_memory(nb.values, blk.values)
1444
1449
blocks .append (nb )
1445
1450
else :
1446
1451
nb = blk .take_nd (taker , axis = 0 , new_mgr_locs = mgr_locs )
@@ -1604,14 +1609,23 @@ def _blklocs(self):
1604
1609
""" compat with BlockManager """
1605
1610
return None
1606
1611
1612
+ def getitem_mgr (self , indexer ) -> SingleBlockManager :
1613
+ # similar to get_slice, but not restricted to slice indexer
1614
+ blk = self ._block
1615
+ array = blk ._slice (indexer )
1616
+ block = blk .make_block_same_class (array , placement = slice (0 , len (array )))
1617
+ return type (self )(block , self .index [indexer ])
1618
+
1607
1619
def get_slice (self , slobj : slice , axis : int = 0 ) -> SingleBlockManager :
1620
+ assert isinstance (slobj , slice ), type (slobj )
1608
1621
if axis >= self .ndim :
1609
1622
raise IndexError ("Requested axis not found in manager" )
1610
1623
1611
1624
blk = self ._block
1612
1625
array = blk ._slice (slobj )
1613
1626
block = blk .make_block_same_class (array , placement = slice (0 , len (array )))
1614
- return type (self )(block , self .index [slobj ])
1627
+ new_index = self .index ._getitem_slice (slobj )
1628
+ return type (self )(block , new_index )
1615
1629
1616
1630
@property
1617
1631
def index (self ) -> Index :
@@ -1975,6 +1989,7 @@ def _preprocess_slice_or_indexer(slice_or_indexer, length: int, allow_fill: bool
1975
1989
):
1976
1990
return "mask" , slice_or_indexer , slice_or_indexer .sum ()
1977
1991
else :
1992
+ # TODO: np.intp?
1978
1993
indexer = np .asanyarray (slice_or_indexer , dtype = np .int64 )
1979
1994
if not allow_fill :
1980
1995
indexer = maybe_convert_indices (indexer , length )
0 commit comments