@@ -70,6 +70,34 @@ def convert(arr, ignore_value2text_conversions=False):
7070 return res
7171
7272
73+ def replace_metadata (dtype , name , attribute , value , current_name = "" ):
74+ if dtype .fields :
75+ new_dt = {
76+ 'names' : [],
77+ 'formats' : [],
78+ 'offsets' : [],
79+ }
80+ for fname , (dt , offset , * _ ) in dtype .fields .items ():
81+ new_dt ['names' ].append (fname )
82+ new_dt ['offsets' ].append (offset )
83+ new_dt ['formats' ].append (
84+ replace_metadata (dt , name , attribute , value , fname )
85+ )
86+
87+ if old_metadata := (dtype .metadata or dtype .base .metadata ):
88+ return np .dtype (new_dt , metadata = dict (old_metadata ))
89+ else :
90+ return np .dtype (new_dt )
91+
92+ else :
93+ if current_name and current_name != name :
94+ return dtype
95+ else :
96+ metadata = dict (dtype .metadata or dtype .base .metadata or {})
97+ metadata [attribute ] = value
98+ return np .dtype (np .lib .format .drop_metadata (dtype ), metadata = metadata )
99+
100+
73101class InvalidationArray (np .ndarray [tuple [int ], np .dtype [np .bool ]]):
74102 ORIGIN_UNKNOWN = ORIGIN_UNKNOWN
75103
@@ -258,10 +286,9 @@ def conversion(self):
258286
259287 @conversion .setter
260288 def conversion (self , conv ):
261- metadata = dict (self .samples .dtype .metadata or self .samples .dtype .base .metadata or {})
262- metadata ['conversion' ] = conv
263289 self .samples = self .samples .view (
264- dtype = np .dtype (np .lib .format .drop_metadata (self .samples .dtype ), metadata = metadata ))
290+ replace_metadata (self .samples .dtype , self .name , "conversion" , conv )
291+ )
265292
266293 @property
267294 def invalidation_bits (self ) -> InvalidationArray | None :
0 commit comments