@@ -3129,6 +3129,26 @@ def __getitem__(self, indx):
3129
3129
if isinstance (indx , basestring ):
3130
3130
if self ._fill_value is not None :
3131
3131
dout ._fill_value = self ._fill_value [indx ]
3132
+
3133
+ # If we're indexing a multidimensional field in a
3134
+ # structured array (such as dtype("(2,)i2,(2,)i1")),
3135
+ # dimensionality goes up (M[field].ndim == M.ndim +
3136
+ # len(M.dtype[field].shape)). That's fine for
3137
+ # M[field] but problematic for M[field].fill_value
3138
+ # which should have shape () to avoid breaking several
3139
+ # methods. There is no great way out, so set to
3140
+ # first element. See issue #6723.
3141
+ if dout ._fill_value .ndim > 0 :
3142
+ if not (dout ._fill_value ==
3143
+ dout ._fill_value .flat [0 ]).all ():
3144
+ warnings .warn (
3145
+ "Upon accessing multidimensional field "
3146
+ "{indx:s}, need to keep dimensionality "
3147
+ "of fill_value at 0. Discarding "
3148
+ "heterogeneous fill_value and setting "
3149
+ "all to {fv!s}." .format (indx = indx ,
3150
+ fv = dout ._fill_value [0 ]))
3151
+ dout ._fill_value = dout ._fill_value .flat [0 ]
3132
3152
dout ._isfield = True
3133
3153
# Update the mask if needed
3134
3154
if _mask is not nomask :
0 commit comments