diff --git a/numpy/_core/src/multiarray/methods.c b/numpy/_core/src/multiarray/methods.c index 62a36f155838..dd3a1469ecd1 100644 --- a/numpy/_core/src/multiarray/methods.c +++ b/numpy/_core/src/multiarray/methods.c @@ -1581,7 +1581,7 @@ _deepcopy_call(char *iptr, char *optr, PyArray_Descr *dtype, } } } - else { + else if (PyDataType_ISOBJECT(dtype)) { PyObject *itemp, *otemp; PyObject *res; memcpy(&itemp, iptr, sizeof(itemp)); diff --git a/numpy/_core/tests/test_stringdtype.py b/numpy/_core/tests/test_stringdtype.py index e765d64609d2..7ed7f975b04b 100644 --- a/numpy/_core/tests/test_stringdtype.py +++ b/numpy/_core/tests/test_stringdtype.py @@ -1,7 +1,7 @@ +import copy import itertools import os import pickle -import string import sys import tempfile @@ -371,6 +371,13 @@ def test_pickle(dtype, string_list): os.remove(f.name) +def test_stdlib_copy(dtype, string_list): + arr = np.array(string_list, dtype=dtype) + + assert_array_equal(copy.copy(arr), arr) + assert_array_equal(copy.deepcopy(arr), arr) + + @pytest.mark.parametrize( "strings", [ @@ -1674,12 +1681,12 @@ def test_zeros(self): assert_array_equal(z, "") def test_copy(self): - c = self.a.copy() - assert_array_equal(self.get_flags(c), self.get_flags(self.a)) - assert_array_equal(c, self.a) - offsets = self.get_view(c)['offset'] - assert offsets[2] == 1 - assert offsets[3] == 1 + len(self.s_medium) + self.sizeofstr // 2 + for c in [self.a.copy(), copy.copy(self.a), copy.deepcopy(self.a)]: + assert_array_equal(self.get_flags(c), self.get_flags(self.a)) + assert_array_equal(c, self.a) + offsets = self.get_view(c)['offset'] + assert offsets[2] == 1 + assert offsets[3] == 1 + len(self.s_medium) + self.sizeofstr // 2 def test_arena_use_with_setting(self): c = np.zeros_like(self.a)