【问题标题】:Concat/merge xr.DataArray along an existing axis (Xarray | Python 3)沿现有轴合并/合并 xr.DataArray (Xarray | Python 3)
【发布时间】:2016-08-12 19:53:11
【问题描述】:

这是一个玩具示例,但我有 2 个数据框; (1) 行=样本,列=属性; (2) rows=samples, cols=metadata-fields。

我想concatmerge 创建3 维xr.DataArray。我已经多次这样做了,但我无法弄清楚为什么它在这种情况下不起作用?我想concat 沿着patient_id 轴有一个3D xr.DataArray

xr.concat 为什么不构建 3 维 DataArray?我认为我错误地使用了 dim 参数,因为它应该沿新轴 concat 但有没有办法沿现有轴做到这一点?

我正在尝试使用Create DataArray from Dict of 2D DataFrames/Arrays 中的方法,但它不起作用。我让merge 工作,但它把它放入DataSet w/2 数据变量

np.random.seed(0)
patient_ids = ["patient_%d"%_ for _ in range(42)]
attr_ids = ["attr_%d"%_ for _ in range(481)]
meta_ids = ["meta_%d"%_ for _ in range(32)]

DA_A = xr.DataArray(pd.DataFrame(np.random.random((42,481)), 
                                 index=patient_ids, 
                                 columns=attr_ids), 
                    dims=["patient_id","attribute"])
DA_B = xr.DataArray(pd.DataFrame(np.random.random((42,32)), 
                                 index=patient_ids,
                                 columns=meta_ids), 
                    dims=["patient_id","metadata"])
DA_A.coords
# Coordinates:
#   * patient_id  (patient_id) object 'patient_0' 'patient_1' 'patient_2' ...
#   * attribute   (attribute) object 'attr_0' 'attr_1' 'attr_2' 'attr_3' ...
DA_B.coords
# Coordinates:
#   * patient_id  (patient_id) object 'patient_0' 'patient_1' 'patient_2' ...
#   * metadata    (metadata) object 'meta_0' 'meta_1' 'meta_2' 'meta_3' ...
xr.concat([DA_A, DA_B], dim="patient_id")
# KeyError: 'attribute'

【问题讨论】:

  • 我认为您不想使用concat。您得到的错误是告诉您DA_B 没有attribute 维度。根据我看到您尝试做的事情,具有共享/对齐维度(患者 ID、属性、元数据)的 Dataset 可能是您想要的。

标签: python pandas python-xarray


【解决方案1】:

您不能(还)连接具有不同维度的 DataArray。您需要先明确广播它们,例如,

In [38]: xr.concat(xr.broadcast(DA_A, DA_B), dim="patient_id")
Out[38]:
<xarray.DataArray (patient_id: 84, attribute: 481, metadata: 32)>
array([[[ 0.5488135 ,  0.5488135 ,  0.5488135 , ...,  0.5488135 ,
          0.5488135 ,  0.5488135 ],
        ...,
        [ 0.79649197,  0.97094708,  0.95542135, ...,  0.37856775,
          0.65855316,  0.37893685]]])
Coordinates:
  * attribute   (attribute) object 'attr_0' 'attr_1' 'attr_2' 'attr_3' ...
  * metadata    (metadata) object 'meta_0' 'meta_1' 'meta_2' 'meta_3' ...
  * patient_id  (patient_id) object 'patient_0' 'patient_1' 'patient_2' ...

但正如 jhamman 在对您的问题的评论中提到的那样,您实际上可能会发现使用单个 Dataset 对象更容易,而是使用两个不同的变量,例如,

In [39]: xr.Dataset({'A': DA_A, 'B': DA_B})
Out[39]:
<xarray.Dataset>
Dimensions:     (attribute: 481, metadata: 32, patient_id: 42)
Coordinates:
  * patient_id  (patient_id) object 'patient_0' 'patient_1' 'patient_2' ...
  * attribute   (attribute) object 'attr_0' 'attr_1' 'attr_2' 'attr_3' ...
  * metadata    (metadata) object 'meta_0' 'meta_1' 'meta_2' 'meta_3' ...
Data variables:
    A           (patient_id, attribute) float64 0.5488 0.7152 0.6028 0.5449 ...
    B           (patient_id, metadata) float64 0.2438 0.8216 0.9237 0.3999 ...

【讨论】:

  • 再次感谢@Stephan,您对xarray 非常有帮助。我已经找到了将它实施到我的日常管道中的方法。我一直在努力向与我合作的生物信息学家宣传。
猜你喜欢
  • 2016-11-24
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2022-01-08
  • 2019-04-09
  • 2018-10-04
相关资源
最近更新 更多