@@ -1779,18 +1779,25 @@ def __init__(
1779
1779
def dtype (self ) -> np .dtype | pd .api .extensions .ExtensionDtype : # type: ignore[override]
1780
1780
return self ._dtype
1781
1781
1782
+ def _get_numpy_dtype (self , dtype : np .typing .DTypeLike | None = None ) -> np .dtype :
1783
+ if dtype is None :
1784
+ if is_valid_numpy_dtype (self .dtype ):
1785
+ return cast (np .dtype , self .dtype )
1786
+ else :
1787
+ return get_valid_numpy_dtype (self .array )
1788
+ else :
1789
+ return np .dtype (dtype )
1790
+
1782
1791
def __array__ (
1783
1792
self ,
1784
1793
dtype : np .typing .DTypeLike | None = None ,
1785
1794
/ ,
1786
1795
* ,
1787
1796
copy : bool | None = None ,
1788
1797
) -> np .ndarray :
1789
- if dtype is None and is_valid_numpy_dtype (self .dtype ):
1790
- dtype = cast (np .dtype , self .dtype )
1791
- else :
1792
- dtype = get_valid_numpy_dtype (self .array )
1798
+ dtype = self ._get_numpy_dtype (dtype )
1793
1799
array = self .array
1800
+
1794
1801
if isinstance (array , pd .PeriodIndex ):
1795
1802
with suppress (AttributeError ):
1796
1803
# this might not be public API
@@ -1830,10 +1837,8 @@ def _convert_scalar(self, item) -> np.ndarray:
1830
1837
# numpy fails to convert pd.Timestamp to np.datetime64[ns]
1831
1838
item = np .asarray (item .to_datetime64 ())
1832
1839
elif self .dtype != object :
1833
- dtype = self .dtype
1834
- if pd .api .types .is_extension_array_dtype (dtype ):
1835
- dtype = get_valid_numpy_dtype (self .array )
1836
- item = np .asarray (item , dtype = cast (np .dtype , dtype ))
1840
+ dtype = self ._get_numpy_dtype ()
1841
+ item = np .asarray (item , dtype = dtype )
1837
1842
1838
1843
# as for numpy.ndarray indexing, we always want the result to be
1839
1844
# a NumPy array.
@@ -1897,7 +1902,9 @@ def copy(self, deep: bool = True) -> Self:
1897
1902
def nbytes (self ) -> int :
1898
1903
if pd .api .types .is_extension_array_dtype (self .dtype ):
1899
1904
return self .array .nbytes
1900
- return cast (np .dtype , self .dtype ).itemsize * len (self .array )
1905
+
1906
+ dtype = self ._get_numpy_dtype ()
1907
+ return dtype .itemsize * len (self .array )
1901
1908
1902
1909
1903
1910
class PandasMultiIndexingAdapter (PandasIndexingAdapter ):
@@ -2073,7 +2080,7 @@ def _index_get(
2073
2080
if isinstance (result , pd .IntervalIndex ):
2074
2081
return type (self )(result , dtype = self .dtype )
2075
2082
elif isinstance (result , pd .Interval ):
2076
- return np .array ([result .left , result .right ])
2083
+ return np .array ([result .left , result .right ], dtype = self . _get_numpy_dtype () )
2077
2084
else :
2078
2085
return self ._convert_scalar (result )
2079
2086
0 commit comments