2016-08-12 153 views
1

這裏是一個玩具的例子,但我有2個數據框; (1)rows = samples,cols = attributes;和(2)rows = samples,cols = metadata-fields。沿着現有軸的Concat/merge xr.DataArray(Xarray | Python 3)

我想要concatmerge創建3維xr.DataArray。我已經做了多次,但我不明白爲什麼它在這種情況下不起作用?我想concat沿着patient_id軸有一個3D xr.DataArray

爲什麼不是xr.concat建立三維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' 
+1

我不認爲你想使用'concat'。你得到的錯誤是告訴你'DA_B'沒有'attribute'維度。根據我看到你試圖做的事情,一個帶有共享/對齊維度(patient_id,attribute,metadata)的'Dataset'可能就是你想要的。 – jhamman

回答

1

你不能(還)連接具有不同的尺寸DataArrays。你需要明確首播它們,例如,

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 ... 
+0

再次感謝@Stephan,你真的對'xarray'很有幫助。我已經找到了將其實施到日常工作中的方法。我一直在試圖將這個詞傳播給我與之合作的生物信息學家。 –