diff --git a/python/pyarrow/array.pxi b/python/pyarrow/array.pxi index 59d2e91ef6c70..ccb51b7337817 100644 --- a/python/pyarrow/array.pxi +++ b/python/pyarrow/array.pxi @@ -1543,7 +1543,8 @@ cdef class Array(_PandasConvertible): def _to_pandas(self, options, types_mapper=None, **kwargs): return _array_like_to_pandas(self, options, types_mapper=types_mapper) - def __array__(self, dtype=None): + def __array__(self, dtype=None, copy=None): + # TODO honor the copy keyword values = self.to_numpy(zero_copy_only=False) if dtype is None: return values diff --git a/python/pyarrow/table.pxi b/python/pyarrow/table.pxi index 54fda1da7dcaf..d86a979533866 100644 --- a/python/pyarrow/table.pxi +++ b/python/pyarrow/table.pxi @@ -525,7 +525,8 @@ cdef class ChunkedArray(_PandasConvertible): return values - def __array__(self, dtype=None): + def __array__(self, dtype=None, copy=None): + # copy keyword can be ignored because to_numpy() already returns a copy values = self.to_numpy() if dtype is None: return values @@ -1533,7 +1534,8 @@ cdef class _Tabular(_PandasConvertible): raise TypeError(f"Do not call {self.__class__.__name__}'s constructor directly, use " f"one of the `{self.__class__.__name__}.from_*` functions instead.") - def __array__(self, dtype=None): + def __array__(self, dtype=None, copy=None): + # copy keyword can be ignored as this always already returns a copy column_arrays = [ np.asarray(self.column(i), dtype=dtype) for i in range(self.num_columns) ] diff --git a/python/pyarrow/tests/test_array.py b/python/pyarrow/tests/test_array.py index 60794ebef3281..0191f15502894 100644 --- a/python/pyarrow/tests/test_array.py +++ b/python/pyarrow/tests/test_array.py @@ -3301,6 +3301,18 @@ def test_array_from_large_pyints(): pa.array([int(2 ** 63)]) +def test_numpy_array_protocol(): + # test the __array__ method on pyarrow.Array + arr = pa.array([1, 2, 3]) + result = np.asarray(arr) + expected = np.array([1, 2, 3], dtype="int64") + np.testing.assert_array_equal(result, expected) + + # this should not raise a deprecation warning with numpy 2.0+ + result = np.asarray(arr, copy=False) + np.testing.assert_array_equal(result, expected) + + def test_array_protocol(): class MyArray: