python-xarray:合并时更改数据类型
python-xarray: Changing dtypes when merging
我正在沿一个轴合并两个数据集(在我的例子中,sample_ID
)。但是,即使第一个和第二个数据库的变量 dtype
都是 int64
,数据库的 dtype
似乎从 int64
转换为 float64
。我的第一个数据库 (existing
) 看起来像:
<xarray.Dataset>
Dimensions: (sample_ID: 3)
Coordinates:
* sample_ID (sample_ID) int64 0 1 2
Data variables:
a (sample_ID) float64 1.0 2.0 1.1
b (sample_ID) float64 5.0 6.0 5.1
varsUpdate (sample_ID) int64 0 0 1
y (sample_ID) float64 100.0 200.0 100.1
x (sample_ID) float64 10.0 20.0 10.1
trajID (sample_ID) int64 1 2 1
第二个数据库(new
)看起来像:
<xarray.Dataset>
Dimensions: (sample_ID: 1)
Coordinates:
* sample_ID (sample_ID) int64 3
Data variables:
a (sample_ID) float64 2.1
b (sample_ID) float64 6.1
varsUpdate (sample_ID) int64 1
y (sample_ID) float64 200.1
x (sample_ID) float64 20.1
trajID (sample_ID) int64 2
调用existing.merge(new,inplace=True)
后的最终结果是
<xarray.Dataset>
Dimensions: (sample_ID: 4)
Coordinates:
* sample_ID (sample_ID) int64 0 1 2 3
Data variables:
a (sample_ID) float64 1.0 2.0 1.1 2.1
b (sample_ID) float64 5.0 6.0 5.1 6.1
varsUpdate (sample_ID) float64 0.0 0.0 1.0 1.0
y (sample_ID) float64 100.0 200.0 100.1 200.1
x (sample_ID) float64 10.0 20.0 10.1 20.1
trajID (sample_ID) float64 1.0 2.0 1.0 2.0
可以看到类型都转换成了float64
。有没有一种有效的方法来维护整数类型?
xarray.merge(...)
在两个阶段过程中合并数据集:
- 它在数据集上调用
xarray.align(..., join='outer')
来对齐它们的坐标。这就引入了NaNs,所以我们需要提升int64 -> float64.
- 它创建合并数据集,作为每个数组位置对齐数据集中的单个非 NaN 值。
由于其工作方式,在参数尚未对齐时引入 NaN 几乎是不可避免的。
加入数据集的更好方法是 xarray.concat(..., dim='sample_ID')
。这不会尝试做任何聪明的事情来沿着连接的维度对齐('sample_ID'
在这种情况下),这意味着它要快得多并且保留整数数据类型。
我正在沿一个轴合并两个数据集(在我的例子中,sample_ID
)。但是,即使第一个和第二个数据库的变量 dtype
都是 int64
,数据库的 dtype
似乎从 int64
转换为 float64
。我的第一个数据库 (existing
) 看起来像:
<xarray.Dataset>
Dimensions: (sample_ID: 3)
Coordinates:
* sample_ID (sample_ID) int64 0 1 2
Data variables:
a (sample_ID) float64 1.0 2.0 1.1
b (sample_ID) float64 5.0 6.0 5.1
varsUpdate (sample_ID) int64 0 0 1
y (sample_ID) float64 100.0 200.0 100.1
x (sample_ID) float64 10.0 20.0 10.1
trajID (sample_ID) int64 1 2 1
第二个数据库(new
)看起来像:
<xarray.Dataset>
Dimensions: (sample_ID: 1)
Coordinates:
* sample_ID (sample_ID) int64 3
Data variables:
a (sample_ID) float64 2.1
b (sample_ID) float64 6.1
varsUpdate (sample_ID) int64 1
y (sample_ID) float64 200.1
x (sample_ID) float64 20.1
trajID (sample_ID) int64 2
调用existing.merge(new,inplace=True)
后的最终结果是
<xarray.Dataset>
Dimensions: (sample_ID: 4)
Coordinates:
* sample_ID (sample_ID) int64 0 1 2 3
Data variables:
a (sample_ID) float64 1.0 2.0 1.1 2.1
b (sample_ID) float64 5.0 6.0 5.1 6.1
varsUpdate (sample_ID) float64 0.0 0.0 1.0 1.0
y (sample_ID) float64 100.0 200.0 100.1 200.1
x (sample_ID) float64 10.0 20.0 10.1 20.1
trajID (sample_ID) float64 1.0 2.0 1.0 2.0
可以看到类型都转换成了float64
。有没有一种有效的方法来维护整数类型?
xarray.merge(...)
在两个阶段过程中合并数据集:
- 它在数据集上调用
xarray.align(..., join='outer')
来对齐它们的坐标。这就引入了NaNs,所以我们需要提升int64 -> float64. - 它创建合并数据集,作为每个数组位置对齐数据集中的单个非 NaN 值。
由于其工作方式,在参数尚未对齐时引入 NaN 几乎是不可避免的。
加入数据集的更好方法是 xarray.concat(..., dim='sample_ID')
。这不会尝试做任何聪明的事情来沿着连接的维度对齐('sample_ID'
在这种情况下),这意味着它要快得多并且保留整数数据类型。