【问题标题】:xarray slice data by multiple dimensionsxarray 按多个维度切片数据
【发布时间】:2019-04-11 04:45:54
【问题描述】:

我正在处理来自 GFS 的预测数据。我编写了以下函数来从预测存档中提取时间序列:

def time_series_from_ensemble_archive(ensemble_archive, lead_time: int=0, ensemble_member: int=0):

    data = ensemble_archive

    data['age'] = (data.validityDateTime - data.as_of_datetime).astype(np.float)
    age_idx =  data['age']==lead_time

    return data[:, ensemble_member, :, :, :].values[age_idx.T, :, :]

它按预期工作:

这里是data

Coordinates:
  * validityDateTime    (validityDateTime) datetime64[ns] 2017-10-01 ...
  * perturbationNumber  (perturbationNumber) int32 0 1 2 3 4 5 6 7 8 9 10 11 ...
  * lon                 (lon) float64 -119.0 -118.5 -118.0 -117.5 -117.0 ...
  * lat                 (lat) float64 45.5 45.0 44.5 44.0 43.5 43.0 42.5 ...
  * as_of_datetime      (as_of_datetime) datetime64[ns] 2017-10-01 ...
Attributes:
    name:                 2 metre temperature

还有我的功能:

temp_ts = time_series_from_ensemble_archive(data)
temp_ts.shape
(124, 10, 20)

type(temp_ts)
numpy.ndarray

但是,我觉得这不是最“pythonic”或“xarrayic”的方法,最好返回另一个 xarray 对象。这里有改进的建议吗?有人可以使用 expand_dims 或 .sel 方法提供解决方案吗?

【问题讨论】:

  • 很难从提供的信息中回答问题。例如,您的示例数据中没有 'age' 属性。你能提供生成示例数据集的代码吗? lead_time 是做什么的?

标签: multidimensional-array slice python-xarray


【解决方案1】:

xarray 提供了多种方式来index and select data。你可以试试indexing with dimension names,例如:

# select using positional & boolean indices
return data[{
    'perturbationNumber': ensemble_member,
    'validityDateTime': (data['age'] == lead_time)}]

或者如果lead_time实际上是一个位置索引,只是

# select using positional indices
return data[{
    'perturbationNumber': ensemble_member,
    'validityDateTime': lead_time}]

如果您想提供索引标签而不是它们的位置,您可以使用.sel.loc 方法:

# select using labels
return data.sel(
    perturbationNumber=ensemble_member,
    validityDateTime=lead_time)

# select using labels and boolean indices
return data.loc[{
    'perturbationNumber': ensemble_member,
    'validityDateTime': (data['age'] == lead_time)}]

调用da.values 是返回xarray 数据的numpy 数组后端的步骤。您的代码没有理由不使用您提供的索引实际 xarray DataArray 的索引(没有.values)。

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2019-05-09
    相关资源
    最近更新 更多