【问题标题】:Get values (point, vector, array, etc.) from `xr.Dataset` in Xarray ? (Python 3)从 Xarray 中的 `xr.Dataset` 获取值(点、向量、数组等)? (Python 3)
【发布时间】:2016-11-25 12:49:54
【问题描述】:

我不知道如何从xr.Dataset 对象中实际提取数据。我不知道如何访问单个值。如何像使用 DataArrays 一样从 Datasets 中提取值(点值、向量、数组等)?

np.random.seed(0)
DA_data = xr.DataArray(np.random.random((3,2,10,100)), dims=["targets","accuracy","metrics","attributes"], name="Data")
DA_data.coords["attributes"] = ["attr_%d"%_ for _ in range(100)]
# DA_data.coords
# Coordinates:
#   * targets     (targets) int64 0 1 2
#   * accuracy    (accuracy) int64 0 1
#   * metrics     (metrics) int64 0 1 2 3 4 5 6 7 8 9
#   * attributes  (attributes) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

# Indexing DataArray
#DA_data.sel(targets=0, accuracy=0, metrics=0, attributes="attr_5").values
#array(0.6458941130666561)
float(DA_data.sel(targets=0, accuracy=0, metrics=0, attributes="attr_5").values)
#0.6458941130666561

# Indexing Dataset
DS_data = DA_data.to_dataset()
# DS_data
# <xarray.Dataset>
# Dimensions:     (accuracy: 2, attributes: 100, metrics: 10, targets: 3)
# Coordinates:
#   * targets     (targets) int64 0 1 2
#   * accuracy    (accuracy) int64 0 1
#   * metrics     (metrics) int64 0 1 2 3 4 5 6 7 8 9
#   * attributes  (attributes) <U7 'attr_0' 'attr_1' 'attr_2' 'attr_3' ...
# Data variables:
#     Data        (targets, accuracy, metrics, attributes) float64 0.5488 ...

DS_data.sel(targets=0, accuracy=0, metrics=0, attributes="attr_5").values
# <bound method Mapping.values of <xarray.Dataset>
# Dimensions:     ()
# Coordinates:
#     targets     int64 0
#     accuracy    int64 0
#     metrics     int64 0
#     attributes  <U7 'attr_5'
# Data variables:
#     Data        float64 0.6459>
float(DS_data.sel(targets=0, accuracy=0, metrics=0, attributes="attr_5").values)
# ---------------------------------------------------------------------------
# TypeError                                 Traceback (most recent call last)
# <ipython-input-408-e0c88e8541d8> in <module>()
#      38 # Data variables:
#      39 #     Data        float64 0.6459>
# ---> 40 float(DS_data.sel(targets=0, accuracy=0, metrics=0, attributes="attr_5").values)

# TypeError: float() argument must be a string or a number, not 'method'

【问题讨论】:

    标签: python arrays multidimensional-array dataset python-xarray


    【解决方案1】:

    这有点令人困惑,但 .valuesDatasetDataArray 上的工作方式不同:

    • DataArray.values 返回一个 NumPy 数组。这种行为与 pandas 一致。
    • Dataset.values() 返回构成数据集的 DataArray 对象的列表 (Python 2) 或 ValuesView (Python 3)。此行为与满足 Python 的 Mapping 接口的 Dataset 一致。

    要从Dataset 中提取值,您需要通过数据集的类字典接口提取DataArray,例如float(DA_data['Data'])float(DA_data.values()[0])。您不能直接将 Dataset 转换为浮点数或 NumPy 数组,就像使用 Python dict 一样。

    【讨论】:

    • 哦,这就是那些Data variables 是...Dataset 中的DataArrays。那么DS_data.sel(targets=0, accuracy=0, metrics=0, attributes="attr_5")["Data"].values 是唯一的方法吗?要对其进行索引,然后将DataArray 拉出并获取值?
    • 是的。数据集用于保存 DataArrays 的集合。如果您只有一个 DataArray,那么使用 Dataset 可能没有多大意义。
    • 我同意,但我使用 Dataset 的唯一原因是您无法保存 DataArray 对象而无需酸洗或转换为 pandas
    • 好点。为此打开了一个新的 GitHub 问题:github.com/pydata/xarray/issues/915
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2019-09-23
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多