如何将自定义对象赋值给xarray DataArray元素并正常调用其方法
报错原因
通过.loc索引xarray.DataArray的单个元素时,返回的是0维的DataArray对象,而非实际存储的自定义类实例,因此无法找到set方法。
同时你初始化DataArray时使用集合定义dims的写法存在隐患:dims要求是按顺序对应数组维度的列表,集合是无序结构,可能导致维度和坐标对应错位。
解决步骤
1. 初始化时明确指定dtype为object
xarray底层基于numpy数组,只有dtype为object的数组才能存储任意Python对象(自定义类、字典、数组等),初始化时就指定类型可避免隐式转换问题:
df_invoice_features = xr.DataArray( data=np.full((len(unique_invoices), len(cols)), None, dtype=object), dims=["y", "x"], # 改为有序列表保证维度对应正确 coords={"y": unique_invoices, "x": cols} )
2. 取值时提取DataArray包裹的实际对象
有两种常用方式可以拿到你存储的自定义类实例,因为存储的是对象引用,修改后无需重新赋值回DataArray,修改会直接生效:
- 方法1:调用
.item()方法提取0维DataArray的实际值
df_invoice_features.loc['basket_value_brand', invoice_id].item().set(0, 10)
- 方法2:通过
.values属性获取底层存储的值
df_invoice_features.loc['basket_value_brand', invoice_id].values.set(0, 10)
存储数组、字典的注意事项
存储numpy数组、Python字典的操作逻辑和自定义类完全一致:
- 初始化时必须指定dtype为object
- 取值后先拿到实际存储的对象再进行修改操作,不要直接对返回的DataArray对象操作
注意:xarray的设计初衷是处理结构化的数值张量数据,存储非数值的object类型对象会丧失大量xarray的内置优化、广播、运算能力,非特殊需求建议优先调整数据结构适配xarray的原生数据格式。
内容的提问来源于stack exchange,提问作者irohamca
相关产品推荐
相关产品推荐

