summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wiebe <mwwiebe@gmail.com>2011-05-21 15:04:05 -0500
committerMark Wiebe <mwwiebe@gmail.com>2011-05-21 15:04:05 -0500
commit3071eab84b81ef6e0d157d46404c631547fed763 (patch)
treef1176ca5ee97d8a5e8433bd8933820db369961b0
parent4a2ad9eb8224f7356212854bcf905e94abe543ac (diff)
downloadnumpy-3071eab84b81ef6e0d157d46404c631547fed763.tar.gz
BUG: Regression of object <-> structured array data copying (ticket #1838)
-rw-r--r--numpy/core/src/multiarray/dtype_transfer.c4
-rw-r--r--numpy/core/tests/test_iterator.py7
-rw-r--r--numpy/core/tests/test_regression.py16
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()