diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 610a39a05148b..08de9002948ae 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1764,6 +1764,9 @@ def get_values(self, dtype=None): return values def to_dense(self): + if self.dtype.kind == "O": + # See https://github.com/numpy/numpy/issues/15041 + return np.asarray(self.values, dtype=object) return np.asarray(self.values) def to_native_types(self, slicer=None, na_rep="nan", quoting=None, **kwargs): diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index 109df6584641d..8c1aaf8f7706c 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -1485,6 +1485,11 @@ def _format_strings(self) -> List[str]: if is_categorical_dtype(values.dtype): # Categorical is special for now, so that we can preserve tzinfo array = values._internal_get_values() + elif values.dtype.kind == "O": + # numpy>=1.18 wants object dtype passed explicitly + # Note: dtype.kind check works for json extension tests, while + # dtype == object check does not. + array = np.asarray(values, dtype=object) else: array = np.asarray(values) diff --git a/pandas/tests/extension/base/interface.py b/pandas/tests/extension/base/interface.py index a29f6deeffae6..b20ef96fa42f5 100644 --- a/pandas/tests/extension/base/interface.py +++ b/pandas/tests/extension/base/interface.py @@ -32,7 +32,11 @@ def test_memory_usage(self, data): assert result == s.nbytes def test_array_interface(self, data): - result = np.array(data) + if hasattr(data, "dtype") and data.dtype.kind == "O": + # e.g. JSONArray + result = np.array(data, dtype=object) + else: + result = np.array(data) assert result[0] == data[0] result = np.array(data, dtype=object) diff --git a/pandas/tests/extension/test_numpy.py b/pandas/tests/extension/test_numpy.py index 221cf0787d839..beb3fc80eccd6 100644 --- a/pandas/tests/extension/test_numpy.py +++ b/pandas/tests/extension/test_numpy.py @@ -51,7 +51,7 @@ def data_missing(allow_in_pandas, dtype): if dtype.numpy_dtype == "object": if _np_version_under1p16: raise pytest.skip("Skipping for NumPy <1.16") - return PandasArray(np.array([np.nan, (1,)])) + return PandasArray(np.array([np.nan, (1,)], dtype=object)) return PandasArray(np.array([np.nan, 1.0])) @@ -78,7 +78,7 @@ def data_for_sorting(allow_in_pandas, dtype): if dtype.numpy_dtype == "object": # Use an empty tuple for first element, then remove, # to disable np.array's shape inference. - return PandasArray(np.array([(), (2,), (3,), (1,)])[1:]) + return PandasArray(np.array([(), (2,), (3,), (1,)], dtype=object)[1:]) return PandasArray(np.array([1, 2, 0])) @@ -90,7 +90,7 @@ def data_missing_for_sorting(allow_in_pandas, dtype): A < B and NA missing. """ if dtype.numpy_dtype == "object": - return PandasArray(np.array([(1,), np.nan, (0,)])) + return PandasArray(np.array([(1,), np.nan, (0,)], dtype=object)) return PandasArray(np.array([1, np.nan, 0])) @@ -106,7 +106,9 @@ def data_for_grouping(allow_in_pandas, dtype): a, b, c = (1,), (2,), (3,) else: a, b, c = np.arange(3) - return PandasArray(np.array([b, b, np.nan, np.nan, a, a, b, c])) + return PandasArray( + np.array([b, b, np.nan, np.nan, a, a, b, c], dtype=dtype.numpy_dtype) + ) @pytest.fixture