【问题标题】:xarray: reshape data, split dimensionxarray:重塑数据,拆分维度
【发布时间】:2017-03-25 11:12:54
【问题描述】:

我在xarray 中有一个数据集,具有以下维度:

Dimensions:      (subject: 30, session: 5, time: 45000)
Coordinates:
  * subject      (subject) object '110' '112' '114' '117' ...
  * session      (session) object 'week1' 'week2' 'week3' ...
  * time         (time) timedelta64[ns] 00:00:00 00:00:00.040000 ...

我想将每个试验(主题/会话组合)分成更小的时间段,例如分成 3 段,每段 15000 个值,生成的维度可能如下所示:

(subject: 30, session: 5, segment: 3, time: 15000)

我已经搜索并尝试了很多东西,但都没有成功,如何做到这一点?

我一直在尝试的一件事似乎很接近,是创建一个新的 MultiIndex 并将其拆开。

segment_data = np.repeat(range(3),len(ds.time)//3)
segment = xr.Variable(dims='time',data=segment_data)
newtime_data = np.tile(ds.time[:len(ds.time)//3],3)
newtime = xr.Variable(dims='time',data=newtime_data)
dsr = ds.assign_coords(segment=segment,newtime=newtime)
dsr = dsr.set_index(segment='segment',newtime='newtime')
dsr = dsr.stack(fragment=['segment','newtime'])

但是最后一行占用了大量内存,并且似乎创建了一个维度fragment: len(ds.time)**2,这似乎不太正确。我也不确定在此之后我需要做什么 (unstack('fragment')?)。

编辑:更多尝试将我带到这里:

x = np.repeat(range(3),15000)
y = np.tile(ds.time[:len(ds.time)//3],3)
dsr = (ds.assign_coords(segment=x,time2=y)
      .set_index(fragment=['segment','time2'])
      .unstack('fragment'))

这给出了这个:

(subject: 30, segment: 3, session: 5, time: 45000, time2: 15000)

这似乎很接近,但并不完全存在,因为每个 time2 点现在都有 45000 个值,而它应该是一个值:

dsr.isel(subject=0,segment=0,session=0,time2=0)
# (time: 45000)

编辑:我终于找到了一种方法,请参阅我的答案。欢迎提出更多建议!

【问题讨论】:

    标签: python python-datetime python-xarray


    【解决方案1】:

    首先确保您有两个新维度的标签。本例如下:

    x = range(3) # 3 segments
    y = ds.time[:len(ds.time)//3] # the first 1/3rd of the time labels
    

    然后根据这些标签创建一个pandas MultiIndex*。

    ind = pd.MultiIndex.from_product((x,y),names=('segment','new_time'))
    

    最后,将 Dataset 中的time 索引替换为这个新索引,然后解开其层级以创建所需的两个维度。

    dsr = ds.assign(time=ind).unstack('time')
    

    您可能想使用rename 重命名新维度:

    dsr = dsr.rename({'new_time':'time'})
    

    结果尺寸:

    (subject: 30, segment: 3, session: 5, time: 15000)
    

    现在唯一不同的是尺寸的顺序(理想情况下应该交换 segmentsession)。我认为transpose 会在这里有所帮助,但"although the order of dimensions on each array will change, the dataset dimensions themselves will remain in fixed (sorted) order." ** 所以我可能会像这样忍受它。

    * 请注意,您将无法使用要拆分的维度的名称,因此这里有'new_time'assign 的不必要限制?

    ** 另一个我无法解释的限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2019-04-11
      • 2021-10-08
      • 1970-01-01
      • 2017-06-10
      • 2017-09-05
      • 1970-01-01
      相关资源
      最近更新 更多