summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wiebe <mwiebe@enthought.com>2011-06-22 10:42:22 -0500
committerMark Wiebe <mwiebe@enthought.com>2011-06-22 10:42:22 -0500
commit7ab154b90e9db0a3aab1af3a02502cfda25ecbe3 (patch)
tree02d60002b5776682df515571ead60e126159e6a2
parent5484bb67606bd77536c6f0f801582857e5cacbf3 (diff)
downloadnumpy-7ab154b90e9db0a3aab1af3a02502cfda25ecbe3.tar.gz
ENH: dtype-struct: Ensure alignment of nested struct dtypes
-rw-r--r--numpy/core/_internal.py6
-rw-r--r--numpy/core/tests/test_dtype.py39
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