@@ -488,10 +488,17 @@ def __array__(self, dtype: np.typing.DTypeLike = None) -> np.ndarray:
488
488
def _oindex_get (self , key ):
489
489
raise NotImplementedError ("This method should be overridden" )
490
490
491
+ def _vindex_get (self , key ):
492
+ raise NotImplementedError ("This method should be overridden" )
493
+
491
494
@property
492
495
def oindex (self ):
493
496
return IndexCallable (self ._oindex_get )
494
497
498
+ @property
499
+ def vindex (self ):
500
+ return IndexCallable (self ._vindex_get )
501
+
495
502
496
503
class ImplicitToExplicitIndexingAdapter (NDArrayMixin ):
497
504
"""Wrap an array, converting tuples into the indicated explicit indexer."""
@@ -585,6 +592,10 @@ def transpose(self, order):
585
592
def _oindex_get (self , indexer ):
586
593
return type (self )(self .array , self ._updated_key (indexer ))
587
594
595
+ def _vindex_get (self , indexer ):
596
+ array = LazilyVectorizedIndexedArray (self .array , self .key )
597
+ return array [indexer ]
598
+
588
599
def __getitem__ (self , indexer ):
589
600
if isinstance (indexer , VectorizedIndexer ):
590
601
array = LazilyVectorizedIndexedArray (self .array , self .key )
@@ -644,6 +655,12 @@ def get_duck_array(self):
644
655
def _updated_key (self , new_key ):
645
656
return _combine_indexers (self .key , self .shape , new_key )
646
657
658
+ def _oindex_get (self , indexer ):
659
+ return type (self )(self .array , self ._updated_key (indexer ))
660
+
661
+ def _vindex_get (self , indexer ):
662
+ return type (self )(self .array , self ._updated_key (indexer ))
663
+
647
664
def __getitem__ (self , indexer ):
648
665
# If the indexed array becomes a scalar, return LazilyIndexedArray
649
666
if all (isinstance (ind , integer_types ) for ind in indexer .tuple ):
@@ -691,6 +708,9 @@ def get_duck_array(self):
691
708
def _oindex_get (self , key ):
692
709
return type (self )(_wrap_numpy_scalars (self .array [key ]))
693
710
711
+ def _vindex_get (self , key ):
712
+ return type (self )(_wrap_numpy_scalars (self .array [key ]))
713
+
694
714
def __getitem__ (self , key ):
695
715
return type (self )(_wrap_numpy_scalars (self .array [key ]))
696
716
@@ -727,6 +747,9 @@ def get_duck_array(self):
727
747
def _oindex_get (self , key ):
728
748
return type (self )(_wrap_numpy_scalars (self .array [key ]))
729
749
750
+ def _vindex_get (self , key ):
751
+ return type (self )(_wrap_numpy_scalars (self .array [key ]))
752
+
730
753
def __getitem__ (self , key ):
731
754
return type (self )(_wrap_numpy_scalars (self .array [key ]))
732
755
@@ -1364,8 +1387,12 @@ def transpose(self, order):
1364
1387
return self .array .transpose (order )
1365
1388
1366
1389
def _oindex_get (self , key ):
1367
- array , key = self ._indexing_array_and_key (key )
1368
- return array [key ]
1390
+ key = _outer_to_numpy_indexer (key , self .array .shape )
1391
+ return self .array [key ]
1392
+
1393
+ def _vindex_get (self , key ):
1394
+ array = NumpyVIndexAdapter (self .array )
1395
+ return array [key .tuple ]
1369
1396
1370
1397
def __getitem__ (self , key ):
1371
1398
array , key = self ._indexing_array_and_key (key )
@@ -1419,6 +1446,9 @@ def _oindex_get(self, key):
1419
1446
value = value [(slice (None ),) * axis + (subkey , Ellipsis )]
1420
1447
return value
1421
1448
1449
+ def _vindex_get (self , key ):
1450
+ raise TypeError ("Vectorized indexing is not supported" )
1451
+
1422
1452
def __getitem__ (self , key ):
1423
1453
if isinstance (key , BasicIndexer ):
1424
1454
return self .array [key .tuple ]
@@ -1465,11 +1495,14 @@ def _oindex_get(self, key):
1465
1495
value = value [(slice (None ),) * axis + (subkey ,)]
1466
1496
return value
1467
1497
1498
+ def _vindex_get (self , key ):
1499
+ return self .array .vindex [key .tuple ]
1500
+
1468
1501
def __getitem__ (self , key ):
1469
1502
if isinstance (key , BasicIndexer ):
1470
1503
return self .array [key .tuple ]
1471
1504
elif isinstance (key , VectorizedIndexer ):
1472
- return self .array . vindex [key . tuple ]
1505
+ return self .vindex [key ]
1473
1506
else :
1474
1507
assert isinstance (key , OuterIndexer )
1475
1508
return self .oindex [key ]
@@ -1551,6 +1584,9 @@ def _convert_scalar(self, item):
1551
1584
def _oindex_get (self , key ):
1552
1585
return self .__getitem__ (key )
1553
1586
1587
+ def _vindex_get (self , key ):
1588
+ return self .__getitem__ (key )
1589
+
1554
1590
def __getitem__ (
1555
1591
self , indexer
1556
1592
) -> (
0 commit comments