diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2011-05-21 15:04:05 -0500 |
---|---|---|
committer | Mark Wiebe <mwwiebe@gmail.com> | 2011-05-21 15:04:05 -0500 |
commit | 3071eab84b81ef6e0d157d46404c631547fed763 (patch) | |
tree | f1176ca5ee97d8a5e8433bd8933820db369961b0 | |
parent | 4a2ad9eb8224f7356212854bcf905e94abe543ac (diff) | |
download | numpy-3071eab84b81ef6e0d157d46404c631547fed763.tar.gz |
BUG: Regression of object <-> structured array data copying (ticket #1838)
-rw-r--r-- | numpy/core/src/multiarray/dtype_transfer.c | 4 | ||||
-rw-r--r-- | numpy/core/tests/test_iterator.py | 7 | ||||
-rw-r--r-- | numpy/core/tests/test_regression.py | 16 |
3 files changed, 23 insertions, 4 deletions
diff --git a/numpy/core/src/multiarray/dtype_transfer.c b/numpy/core/src/multiarray/dtype_transfer.c index b64e1684a..f04dbe8eb 100644 --- a/numpy/core/src/multiarray/dtype_transfer.c +++ b/numpy/core/src/multiarray/dtype_transfer.c @@ -2962,8 +2962,8 @@ PyArray_GetDTypeTransferFunction(int aligned, } /* Handle fields */ - if (PyDataType_HASFIELDS(src_dtype) || - PyDataType_HASFIELDS(dst_dtype)) { + if ((PyDataType_HASFIELDS(src_dtype) || PyDataType_HASFIELDS(dst_dtype)) && + src_type_num != NPY_OBJECT && dst_type_num != NPY_OBJECT) { return get_fields_transfer_function(aligned, src_stride, dst_stride, src_dtype, dst_dtype, diff --git a/numpy/core/tests/test_iterator.py b/numpy/core/tests/test_iterator.py index 8898657b2..f1ee95b29 100644 --- a/numpy/core/tests/test_iterator.py +++ b/numpy/core/tests/test_iterator.py @@ -1666,12 +1666,15 @@ def test_iter_buffered_cast_structured_type(): # object -> struct type sdt = [('a', 'f4'), ('b', 'i8'), ('c', 'c8', (2,3)), ('d', 'O')] - a = np.arange(3, dtype='O') + 0.5 + a = np.zeros((3,), dtype='O') + a[0] = (0.5,0.5,[[0.5,0.5,0.5],[0.5,0.5,0.5]],0.5) + a[1] = (1.5,1.5,[[1.5,1.5,1.5],[1.5,1.5,1.5]],1.5) + a[2] = (2.5,2.5,[[2.5,2.5,2.5],[2.5,2.5,2.5]],2.5) rc = sys.getrefcount(a[0]) i = nditer(a, ['buffered','refs_ok'], ['readonly'], casting='unsafe', op_dtypes=sdt) - vals = [np.array(x) for x in i] + vals = [x.copy() for x in i] assert_equal(vals[0]['a'], 0.5) assert_equal(vals[0]['b'], 0) assert_equal(vals[0]['c'], [[(0.5)]*3]*2) diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py index 5264ff31e..d574c42f2 100644 --- a/numpy/core/tests/test_regression.py +++ b/numpy/core/tests/test_regression.py @@ -1597,5 +1597,21 @@ class TestRegression(TestCase): s = re.sub("a(.)", "\x01\\1", "a_") assert_equal(s[0], "\x01") + def test_structured_type_to_object(self): + a_rec = np.array([(0,1), (3,2)], dtype='i4,i8') + a_obj = np.empty((2,), dtype=object) + a_obj[0] = (0,1) + a_obj[1] = (3,2) + # astype records -> object + assert_equal(a_rec.astype(object), a_obj) + # '=' records -> object + b = np.empty_like(a_obj) + b[...] = a_rec + assert_equal(b, a_obj) + # '=' object -> records + b = np.empty_like(a_rec) + b[...] = a_obj + assert_equal(b, a_rec) + if __name__ == "__main__": run_module_suite() |