diff options
author | Mark Wiebe <mwiebe@enthought.com> | 2011-06-22 10:42:22 -0500 |
---|---|---|
committer | Mark Wiebe <mwiebe@enthought.com> | 2011-06-22 10:42:22 -0500 |
commit | 7ab154b90e9db0a3aab1af3a02502cfda25ecbe3 (patch) | |
tree | 02d60002b5776682df515571ead60e126159e6a2 | |
parent | 5484bb67606bd77536c6f0f801582857e5cacbf3 (diff) | |
download | numpy-7ab154b90e9db0a3aab1af3a02502cfda25ecbe3.tar.gz |
ENH: dtype-struct: Ensure alignment of nested struct dtypes
-rw-r--r-- | numpy/core/_internal.py | 6 | ||||
-rw-r--r-- | numpy/core/tests/test_dtype.py | 39 |
2 files changed, 40 insertions, 5 deletions
diff --git a/numpy/core/_internal.py b/numpy/core/_internal.py index a5b6d117a..99e64d475 100644 --- a/numpy/core/_internal.py +++ b/numpy/core/_internal.py @@ -12,7 +12,7 @@ if (sys.byteorder == 'little'): else: _nbo = asbytes('>') -def _makenames_list(adict): +def _makenames_list(adict, align): from multiarray import dtype allfields = [] fnames = adict.keys() @@ -26,7 +26,7 @@ def _makenames_list(adict): num = int(obj[1]) if (num < 0): raise ValueError("invalid offset.") - format = dtype(obj[0]) + format = dtype(obj[0], align=align) if (format.itemsize == 0): raise ValueError("all itemsizes must be fixed.") if (n > 2): @@ -53,7 +53,7 @@ def _usefields(adict, align): except KeyError: names = None if names is None: - names, formats, offsets, titles = _makenames_list(adict) + names, formats, offsets, titles = _makenames_list(adict, align) else: formats = [] offsets = [] diff --git a/numpy/core/tests/test_dtype.py b/numpy/core/tests/test_dtype.py index ebd9a79eb..772b23206 100644 --- a/numpy/core/tests/test_dtype.py +++ b/numpy/core/tests/test_dtype.py @@ -92,11 +92,46 @@ class TestRecord(TestCase): assert_equal(dt.itemsize, 8) dt = np.dtype([('f0', 'i4'), ('f1', 'i1')], align=True) assert_equal(dt.itemsize, 8) - dt = np.dtype({'names':['f0','f1'], 'formats':['i4', 'u1'], - 'offsets':[0,4]}, align=True) + dt = np.dtype({'names':['f0','f1'], + 'formats':['i4', 'u1'], + 'offsets':[0,4]}, align=True) assert_equal(dt.itemsize, 8) dt = np.dtype({'f0': ('i4', 0), 'f1':('u1', 4)}, align=True) assert_equal(dt.itemsize, 8) + # Nesting should preserve that alignment + dt1 = np.dtype([('f0', 'i4'), + ('f1', [('f1', 'i1'), ('f2', 'i4'), ('f3', 'i1')]), + ('f2', 'i1')], align=True) + assert_equal(dt1.itemsize, 20) + dt2 = np.dtype({'names':['f0','f1','f2'], + 'formats':['i4', + [('f1', 'i1'), ('f2', 'i4'), ('f3', 'i1')], + 'i1'], + 'offsets':[0, 4, 16]}, align=True) + assert_equal(dt2.itemsize, 20) + dt3 = np.dtype({'f0': ('i4', 0), + 'f1': ([('f1', 'i1'), ('f2', 'i4'), ('f3', 'i1')], 4), + 'f2': ('i1', 16)}, align=True) + assert_equal(dt3.itemsize, 20) + assert_equal(dt1, dt2) + assert_equal(dt2, dt3) + # Nesting should preserve packing + dt1 = np.dtype([('f0', 'i4'), + ('f1', [('f1', 'i1'), ('f2', 'i4'), ('f3', 'i1')]), + ('f2', 'i1')], align=False) + assert_equal(dt1.itemsize, 11) + dt2 = np.dtype({'names':['f0','f1','f2'], + 'formats':['i4', + [('f1', 'i1'), ('f2', 'i4'), ('f3', 'i1')], + 'i1'], + 'offsets':[0, 4, 10]}, align=False) + assert_equal(dt2.itemsize, 11) + dt3 = np.dtype({'f0': ('i4', 0), + 'f1': ([('f1', 'i1'), ('f2', 'i4'), ('f3', 'i1')], 4), + 'f2': ('i1', 10)}, align=False) + assert_equal(dt3.itemsize, 11) + assert_equal(dt1, dt2) + assert_equal(dt2, dt3) def test_union_struct(self): # Should be able to create union dtypes |