Strip padding fields in dtypes, update the tests
diff --git a/example/example20.cpp b/example/example20.cpp
index 2c24e6d..32b50e3 100644
--- a/example/example20.cpp
+++ b/example/example20.cpp
@@ -44,6 +44,19 @@
     return os << "n:a=" << v.a << ";b=" << v.b;
 }
 
+struct PartialStruct {
+    bool x;
+    uint32_t y;
+    float z;
+    long dummy2;
+};
+
+struct PartialNestedStruct {
+    long dummy1;
+    PartialStruct a;
+    long dummy2;
+};
+
 struct UnboundStruct { };
 
 template <typename T>
@@ -54,7 +67,7 @@
 }
 
 template <typename S>
-py::array_t<S> create_recarray(size_t n) {
+py::array_t<S, 0> create_recarray(size_t n) {
     auto arr = mkarray_via_buffer<S>(n);
     auto ptr = static_cast<S*>(arr.request().ptr);
     for (size_t i = 0; i < n; i++) {
@@ -67,7 +80,7 @@
     return py::format_descriptor<UnboundStruct>::format();
 }
 
-py::array_t<NestedStruct> create_nested(size_t n) {
+py::array_t<NestedStruct, 0> create_nested(size_t n) {
     auto arr = mkarray_via_buffer<NestedStruct>(n);
     auto ptr = static_cast<NestedStruct*>(arr.request().ptr);
     for (size_t i = 0; i < n; i++) {
@@ -77,8 +90,17 @@
     return arr;
 }
 
+py::array_t<PartialNestedStruct, 0> create_partial_nested(size_t n) {
+    auto arr = mkarray_via_buffer<PartialNestedStruct>(n);
+    auto ptr = static_cast<PartialNestedStruct*>(arr.request().ptr);
+    for (size_t i = 0; i < n; i++) {
+        ptr[i].a.x = i % 2; ptr[i].a.y = (uint32_t) i; ptr[i].a.z = (float) i * 1.5f;
+    }
+    return arr;
+}
+
 template <typename S>
-void print_recarray(py::array_t<S> arr) {
+void print_recarray(py::array_t<S, 0> arr) {
     auto buf = arr.request();
     auto ptr = static_cast<S*>(buf.ptr);
     for (size_t i = 0; i < buf.size; i++)
@@ -89,6 +111,8 @@
     std::cout << py::format_descriptor<SimpleStruct>::format() << std::endl;
     std::cout << py::format_descriptor<PackedStruct>::format() << std::endl;
     std::cout << py::format_descriptor<NestedStruct>::format() << std::endl;
+    std::cout << py::format_descriptor<PartialStruct>::format() << std::endl;
+    std::cout << py::format_descriptor<PartialNestedStruct>::format() << std::endl;
 }
 
 void print_dtypes() {
@@ -98,16 +122,22 @@
     std::cout << to_str(py::dtype_of<SimpleStruct>()) << std::endl;
     std::cout << to_str(py::dtype_of<PackedStruct>()) << std::endl;
     std::cout << to_str(py::dtype_of<NestedStruct>()) << std::endl;
+    std::cout << to_str(py::dtype_of<PartialStruct>()) << std::endl;
+    std::cout << to_str(py::dtype_of<PartialNestedStruct>()) << std::endl;
 }
 
 void init_ex20(py::module &m) {
     PYBIND11_NUMPY_DTYPE(SimpleStruct, x, y, z);
     PYBIND11_NUMPY_DTYPE(PackedStruct, x, y, z);
     PYBIND11_NUMPY_DTYPE(NestedStruct, a, b);
+    PYBIND11_NUMPY_DTYPE(PartialStruct, x, y, z);
+    PYBIND11_NUMPY_DTYPE(PartialNestedStruct, a);
 
     m.def("create_rec_simple", &create_recarray<SimpleStruct>);
     m.def("create_rec_packed", &create_recarray<PackedStruct>);
     m.def("create_rec_nested", &create_nested);
+    m.def("create_rec_partial", &create_recarray<PartialStruct>);
+    m.def("create_rec_partial_nested", &create_partial_nested);
     m.def("print_format_descriptors", &print_format_descriptors);
     m.def("print_rec_simple", &print_recarray<SimpleStruct>);
     m.def("print_rec_packed", &print_recarray<PackedStruct>);
diff --git a/example/example20.py b/example/example20.py
index e0a0018..85ea9ae 100644
--- a/example/example20.py
+++ b/example/example20.py
@@ -5,7 +5,8 @@
 import numpy as np
 from example import (
     create_rec_simple, create_rec_packed, create_rec_nested, print_format_descriptors,
-    print_rec_simple, print_rec_packed, print_rec_nested, print_dtypes, get_format_unbound
+    print_rec_simple, print_rec_packed, print_rec_nested, print_dtypes, get_format_unbound,
+    create_rec_partial, create_rec_partial_nested
 )
 
 
@@ -23,6 +24,8 @@
                          'offsets': [0, 4, 8]})
 packed_dtype = np.dtype([('x', '?'), ('y', 'u4'), ('z', 'f4')])
 
+elements = [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)]
+
 for func, dtype in [(create_rec_simple, simple_dtype), (create_rec_packed, packed_dtype)]:
     arr = func(0)
     assert arr.dtype == dtype
@@ -31,14 +34,30 @@
 
     arr = func(3)
     assert arr.dtype == dtype
-    check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], simple_dtype)
-    check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], packed_dtype)
+    check_eq(arr, elements, simple_dtype)
+    check_eq(arr, elements, packed_dtype)
 
     if dtype == simple_dtype:
         print_rec_simple(arr)
     else:
         print_rec_packed(arr)
 
+
+arr = create_rec_partial(3)
+print(arr.dtype)
+partial_dtype = arr.dtype
+assert '' not in arr.dtype.fields
+assert partial_dtype.itemsize > simple_dtype.itemsize
+check_eq(arr, elements, simple_dtype)
+check_eq(arr, elements, packed_dtype)
+
+arr = create_rec_partial_nested(3)
+print(arr.dtype)
+assert '' not in arr.dtype.fields
+assert '' not in arr.dtype.fields['a'][0].fields
+assert arr.dtype.itemsize > partial_dtype.itemsize
+np.testing.assert_equal(arr['a'], create_rec_partial(3))
+
 nested_dtype = np.dtype([('a', simple_dtype), ('b', packed_dtype)])
 
 arr = create_rec_nested(0)
diff --git a/example/example20.ref b/example/example20.ref
index 32e2b4b..72a6c18 100644
--- a/example/example20.ref
+++ b/example/example20.ref
@@ -1,15 +1,21 @@
-T{?:x:xxxI:y:f:z:}
-T{?:x:=I:y:f:z:}
-T{T{?:x:xxxI:y:f:z:}:a:T{?:x:=I:y:f:z:}:b:}
+T{=?:x:3x=I:y:=f:z:}
+T{=?:x:=I:y:=f:z:}
+T{=T{=?:x:3x=I:y:=f:z:}:a:=T{=?:x:=I:y:=f:z:}:b:}
+T{=?:x:3x=I:y:=f:z:12x}
+T{8x=T{=?:x:3x=I:y:=f:z:12x}:a:8x}
 {'names':['x','y','z'], 'formats':['?','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':12}
 [('x', '?'), ('y', '<u4'), ('z', '<f4')]
 [('a', {'names':['x','y','z'], 'formats':['?','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':12}), ('b', [('x', '?'), ('y', '<u4'), ('z', '<f4')])]
+{'names':['x','y','z'], 'formats':['?','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':24}
+{'names':['a'], 'formats':[{'names':['x','y','z'], 'formats':['?','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':24}], 'offsets':[8], 'itemsize':40}
 s:0,0,0
 s:1,1,1.5
 s:0,2,3
 p:0,0,0
 p:1,1,1.5
 p:0,2,3
+{'names':['x','y','z'], 'formats':['?','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':24}
+{'names':['a'], 'formats':[{'names':['x','y','z'], 'formats':['?','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':24}], 'offsets':[8], 'itemsize':40}
 n:a=s:0,0,0;b=p:1,1,1.5
 n:a=s:1,1,1.5;b=p:0,2,3
 n:a=s:0,2,3;b=p:1,3,4.5
\ No newline at end of file