xarray.Dataset.where() 方法将 DataArrays 的 dtype 强制更改为浮动

Ray*_*Ray 5 python python-xarray

问题描述

我有一个包含ints的数据集,我想根据某些条件选择一个子数据集,但我想保留整数数据类型。在我看来,Xarray 强制将整数数据更改为浮点数据类型。

示例设置

代码

import numpy
import xarray

nums = numpy.random.randint(0, 100, 13)
names = numpy.random.choice(["babadook", "samara", "jason"], 13)
data_vars = {"num": xarray.DataArray(nums), "name": xarray.DataArray(names)}
dataset = xarray.Dataset(data_vars)
print(dataset)
Run Code Online (Sandbox Code Playgroud)

输出

import numpy
import xarray

nums = numpy.random.randint(0, 100, 13)
names = numpy.random.choice(["babadook", "samara", "jason"], 13)
data_vars = {"num": xarray.DataArray(nums), "name": xarray.DataArray(names)}
dataset = xarray.Dataset(data_vars)
print(dataset)
Run Code Online (Sandbox Code Playgroud)

示例问题

代码

subdataset = dataset.where(dataset.num < 50, drop=True)
print(subdataset)
Run Code Online (Sandbox Code Playgroud)

输出

<xarray.Dataset>
Dimensions:  (dim_0: 13)
Coordinates:
  * dim_0    (dim_0) int64 0 1 2 3 4 5 6 7 8 9 10 11 12
Data variables:
    num      (dim_0) int64 93 99 49 35 92 14 41 57 28 59 74 1 15
    name     (dim_0) <U8 'babadook' 'samara' 'samara' 'samara' 'jason' ...
In [16]:
Run Code Online (Sandbox Code Playgroud)

Max*_*ian 5

那是因为使用 numpy(xarray 在后台使用)int 没有表示NaNs 的方法。因此,对于大多数where结果,类型需要强制为浮点数。

如果drop=True并且每个被屏蔽的值都被删除,那实际上并不是一个约束——你可以让新数组保留它的 dtype,因为不需要NaN值。这目前不在 xarray 中,但可能是一个附加功能。

  • 如果你希望它们都作为 `int` 你不需要迭代:`xr.Dataset({'a':xr.DataArray(np.random.rand(10,3)), 'b': xr.DataArray (np.random.rand(10))}).astype('int')` 有效。 (2认同)