@@ -1454,13 +1454,16 @@ def df_length_expr(self):
14541454 return '0'
14551455
14561456
1457- def df_index_expr (self , length_expr = None ):
1457+ def df_index_expr (self , length_expr = None , as_range = False ):
14581458 """Generate expression to get or create index of DF"""
14591459 if isinstance (self .index , types .NoneType ):
14601460 if length_expr is None :
14611461 length_expr = df_length_expr (self )
14621462
1463- return f'numpy.arange({ length_expr } )'
1463+ if as_range :
1464+ return f'range({ length_expr } )'
1465+ else :
1466+ return f'numpy.arange({ length_expr } )'
14641467
14651468 return 'self._index'
14661469
@@ -1507,12 +1510,13 @@ def df_getitem_bool_series_idx_main_codelines(self, idx):
15071510 # optimization for default indexes in df and idx when index alignment is trivial
15081511 if (isinstance (self .index , types .NoneType ) and isinstance (idx .index , types .NoneType )):
15091512 func_lines = [f' length = { df_length_expr (self )} ' ,
1513+ f' self_index = { df_index_expr (self , as_range = True )} ' ,
15101514 f' if length > len(idx):' ,
15111515 f' msg = "Unalignable boolean Series provided as indexer " + \\ ' ,
15121516 f' "(index of the boolean Series and of the indexed object do not match)."' ,
15131517 f' raise IndexingError(msg)' ,
15141518 f' # do not trim idx._data to length as getitem_by_mask handles such case' ,
1515- f' res_index = getitem_by_mask(self.index , idx._data)' ,
1519+ f' res_index = getitem_by_mask(self_index , idx._data)' ,
15161520 f' # df index is default, same as positions so it can be used in take' ]
15171521 results = []
15181522 for i , col in enumerate (self .columns ):
@@ -1532,7 +1536,7 @@ def df_getitem_bool_series_idx_main_codelines(self, idx):
15321536 f' self_index = self.index' ,
15331537 f' idx_reindexed = sdc_reindex_series(idx._data, idx.index, idx._name, self_index)' ,
15341538 f' res_index = getitem_by_mask(self_index, idx_reindexed._data)' ,
1535- f' selected_pos = getitem_by_mask(numpy.arange (length), idx_reindexed._data)' ]
1539+ f' selected_pos = getitem_by_mask(range (length), idx_reindexed._data)' ]
15361540
15371541 results = []
15381542 for i , col in enumerate (self .columns ):
@@ -1553,11 +1557,13 @@ def df_getitem_bool_series_idx_main_codelines(self, idx):
15531557
15541558def df_getitem_bool_array_idx_main_codelines (self , idx ):
15551559 """Generate main code lines for df.getitem"""
1560+
15561561 func_lines = [f' length = { df_length_expr (self )} ' ,
15571562 f' if length != len(idx):' ,
15581563 f' raise ValueError("Item wrong length.")' ,
1559- f' taken_pos = getitem_by_mask(numpy.arange(length), idx)' ,
1560- f' res_index = sdc_take(self.index, taken_pos)' ]
1564+ f' self_index = { df_index_expr (self , as_range = True )} ' ,
1565+ f' taken_pos = getitem_by_mask(self_index, idx)' ,
1566+ f' res_index = sdc_take(self_index, taken_pos)' ]
15611567 results = []
15621568 for i , col in enumerate (self .columns ):
15631569 res_data = f'res_data_{ i } '
@@ -1635,12 +1641,13 @@ def df_getitem_bool_series_idx_codegen(self, idx):
16351641 Example of generated implementation with provided index:
16361642 def _df_getitem_bool_series_idx_impl(self, idx):
16371643 length = len(self._data[0])
1644+ self_index = range(len(self._data[0]))
16381645 if length > len(idx):
16391646 msg = "Unalignable boolean Series provided as indexer " + \
16401647 "(index of the boolean Series and of the indexed object do not match)."
16411648 raise IndexingError(msg)
16421649 # do not trim idx._data to length as getitem_by_mask handles such case
1643- res_index = getitem_by_mask(self.index , idx._data)
1650+ res_index = getitem_by_mask(self_index , idx._data)
16441651 # df index is default, same as positions so it can be used in take
16451652 data_0 = self._data[0]
16461653 res_data_0 = sdc_take(data_0, res_index)
@@ -1667,8 +1674,9 @@ def _df_getitem_bool_array_idx_impl(self, idx):
16671674 length = len(self._data[0])
16681675 if length != len(idx):
16691676 raise ValueError("Item wrong length.")
1670- taken_pos = getitem_by_mask(numpy.arange(length), idx)
1671- res_index = sdc_take(self.index, taken_pos)
1677+ self_index = range(len(self._data[0]))
1678+ taken_pos = getitem_by_mask(self_index, idx)
1679+ res_index = sdc_take(self_index, taken_pos)
16721680 data_0 = self._data[0]
16731681 res_data_0 = sdc_take(data_0, taken_pos)
16741682 data_1 = self._data[1]
0 commit comments