@@ -315,6 +315,24 @@ def parse_metadata(data: ArrayV2Metadata) -> ArrayV2Metadata:
315
315
return data
316
316
317
317
318
+ def parse_structured_fill_value (fill_value : Any , dtype : np .dtype [Any ]) -> Any :
319
+ """Handle structured dtype/fill value pairs"""
320
+ try :
321
+ if isinstance (fill_value , (tuple , list )):
322
+ fill_value = np .array ([fill_value ], dtype = dtype )[0 ]
323
+ elif isinstance (fill_value , bytes ):
324
+ fill_value = np .frombuffer (fill_value , dtype = dtype )[0 ]
325
+ elif isinstance (fill_value , str ):
326
+ decoded = base64 .standard_b64decode (fill_value )
327
+ fill_value = np .frombuffer (decoded , dtype = dtype )[0 ]
328
+ else :
329
+ fill_value = np .array (fill_value , dtype = dtype )[()]
330
+ except Exception as e :
331
+ msg = f"Fill_value { fill_value } is not valid for dtype { dtype } ."
332
+ raise ValueError (msg ) from e
333
+ return fill_value
334
+
335
+
318
336
def parse_fill_value (fill_value : Any , dtype : np .dtype [Any ]) -> Any :
319
337
"""
320
338
Parse a potential fill value into a value that is compatible with the provided dtype.
@@ -332,8 +350,9 @@ def parse_fill_value(fill_value: Any, dtype: np.dtype[Any]) -> Any:
332
350
"""
333
351
334
352
if fill_value is None or dtype .hasobject :
335
- # no fill value
336
353
pass
354
+ elif dtype .fields is not None :
355
+ fill_value = parse_structured_fill_value (fill_value , dtype )
337
356
elif not isinstance (fill_value , np .void ) and fill_value == 0 :
338
357
# this should be compatible across numpy versions for any array type, including
339
358
# structured arrays
0 commit comments