1313
1414import numpy as np
1515import pandas as pd
16+ from packaging .version import Version
1617
1718from xarray .core import duck_array_ops
1819from xarray .core .nputils import NumpyVIndexAdapter
@@ -505,9 +506,14 @@ class ExplicitlyIndexed:
505506
506507 __slots__ = ()
507508
508- def __array__ (self , dtype : np .typing .DTypeLike = None ) -> np .ndarray :
509+ def __array__ (
510+ self , dtype : np .typing .DTypeLike = None , / , * , copy : bool | None = None
511+ ) -> np .ndarray :
509512 # Leave casting to an array up to the underlying array type.
510- return np .asarray (self .get_duck_array (), dtype = dtype )
513+ if Version (np .__version__ ) >= Version ("2.0.0" ):
514+ return np .asarray (self .get_duck_array (), dtype = dtype , copy = copy )
515+ else :
516+ return np .asarray (self .get_duck_array (), dtype = dtype )
511517
512518 def get_duck_array (self ):
513519 return self .array
@@ -520,11 +526,6 @@ def get_duck_array(self):
520526 key = BasicIndexer ((slice (None ),) * self .ndim )
521527 return self [key ]
522528
523- def __array__ (self , dtype : np .typing .DTypeLike = None ) -> np .ndarray :
524- # This is necessary because we apply the indexing key in self.get_duck_array()
525- # Note this is the base class for all lazy indexing classes
526- return np .asarray (self .get_duck_array (), dtype = dtype )
527-
528529 def _oindex_get (self , indexer : OuterIndexer ):
529530 raise NotImplementedError (
530531 f"{ self .__class__ .__name__ } ._oindex_get method should be overridden"
@@ -570,8 +571,13 @@ def __init__(self, array, indexer_cls: type[ExplicitIndexer] = BasicIndexer):
570571 self .array = as_indexable (array )
571572 self .indexer_cls = indexer_cls
572573
573- def __array__ (self , dtype : np .typing .DTypeLike = None ) -> np .ndarray :
574- return np .asarray (self .get_duck_array (), dtype = dtype )
574+ def __array__ (
575+ self , dtype : np .typing .DTypeLike = None , / , * , copy : bool | None = None
576+ ) -> np .ndarray :
577+ if Version (np .__version__ ) >= Version ("2.0.0" ):
578+ return np .asarray (self .get_duck_array (), dtype = dtype , copy = copy )
579+ else :
580+ return np .asarray (self .get_duck_array (), dtype = dtype )
575581
576582 def get_duck_array (self ):
577583 return self .array .get_duck_array ()
@@ -830,9 +836,6 @@ def __init__(self, array):
830836 def _ensure_cached (self ):
831837 self .array = as_indexable (self .array .get_duck_array ())
832838
833- def __array__ (self , dtype : np .typing .DTypeLike = None ) -> np .ndarray :
834- return np .asarray (self .get_duck_array (), dtype = dtype )
835-
836839 def get_duck_array (self ):
837840 self ._ensure_cached ()
838841 return self .array .get_duck_array ()
@@ -1674,15 +1677,21 @@ def __init__(self, array: pd.Index, dtype: DTypeLike = None):
16741677 def dtype (self ) -> np .dtype :
16751678 return self ._dtype
16761679
1677- def __array__ (self , dtype : DTypeLike = None ) -> np .ndarray :
1680+ def __array__ (
1681+ self , dtype : np .typing .DTypeLike = None , / , * , copy : bool | None = None
1682+ ) -> np .ndarray :
16781683 if dtype is None :
16791684 dtype = self .dtype
16801685 array = self .array
16811686 if isinstance (array , pd .PeriodIndex ):
16821687 with suppress (AttributeError ):
16831688 # this might not be public API
16841689 array = array .astype ("object" )
1685- return np .asarray (array .values , dtype = dtype )
1690+
1691+ if Version (np .__version__ ) >= Version ("2.0.0" ):
1692+ return np .asarray (array .values , dtype = dtype , copy = copy )
1693+ else :
1694+ return np .asarray (array .values , dtype = dtype )
16861695
16871696 def get_duck_array (self ) -> np .ndarray :
16881697 return np .asarray (self )
@@ -1831,15 +1840,17 @@ def __init__(
18311840 super ().__init__ (array , dtype )
18321841 self .level = level
18331842
1834- def __array__ (self , dtype : DTypeLike = None ) -> np .ndarray :
1843+ def __array__ (
1844+ self , dtype : np .typing .DTypeLike = None , / , * , copy : bool | None = None
1845+ ) -> np .ndarray :
18351846 if dtype is None :
18361847 dtype = self .dtype
18371848 if self .level is not None :
18381849 return np .asarray (
18391850 self .array .get_level_values (self .level ).values , dtype = dtype
18401851 )
18411852 else :
1842- return super ().__array__ (dtype )
1853+ return super ().__array__ (dtype , copy = copy )
18431854
18441855 def _convert_scalar (self , item ):
18451856 if isinstance (item , tuple ) and self .level is not None :
0 commit comments