为何xarray中相同操作仅能将一个data_array首列正确转为NaN
问题成因
你的代码逻辑依赖.values返回xarray底层数组的视图,修改视图同步改变原xarray对象内的存储值,再将已修改的原数组assign回对象。但xarray的.values属性不保证总是返回视图,两个对象表现不一致的核心原因是底层存储结构不同:
xarray_obj_1的data_array是连续存储的numpy数组,.values返回视图,你修改data_array_1[:,0]时直接改动了原xarray内的数组值,因此assign原数组时修改生效xarray_obj_2的data_array底层是分块dask数组、非连续存储数组或带延迟计算的数组,.values返回的是独立副本,修改data_array_2完全不会影响原xarray内的数组值,你再assign原数组等于没有做任何修改,因此首列保持原值。
正确实现方案
不要依赖.values的视图特性,直接使用xarray原生语法操作,或者将修改后的数组显式传入assign即可,推荐两种写法:
写法1:直接原位修改(最简单,适合允许修改原对象的场景)
import numpy as np # 直接对xarray数组的第二维(列维度)首位置赋值,兼容所有底层存储类型 xarray_obj_1['data_array'][:, 0] = np.nan xarray_obj_2['data_array'][:, 0] = np.nan
如果你的列维度有自定义名称,也可以用更规范的索引写法避免维度顺序出错:
# 假设列维度的名称为`feature`,替换为你实际的维度名即可 xarray_obj_1['data_array'].loc[:, dict(feature=0)] = np.nan xarray_obj_2['data_array'].loc[:, dict(feature=0)] = np.nan
写法2:assign显式赋值(适合不想修改原对象的场景)
直接将修改后的numpy数组传入assign,不需要依赖原数组是否被改动:
import numpy as np # 处理xarray_obj_1 data_array_1 = xarray_obj_1['data_array'].values data_array_1[:, 0] = np.nan xarray_obj_1 = xarray_obj_1.assign(data_array=data_array_1) # 处理xarray_obj_2 data_array_2 = xarray_obj_2['data_array'].values data_array_2[:, 0] = np.nan xarray_obj_2 = xarray_obj_2.assign(data_array=data_array_2)
内容的提问来源于stack exchange,提问作者pythonbeginner90
相关产品推荐
相关产品推荐

