2017-06-20 42 views
1

我正在尋找一種簡潔的方法來對DataArray的單個維數進行算術運算,然後將結果作爲新的DataArray(已更改和未更改的部分)返回。在熊貓中,我會使用df.subtract()來做到這一點,但我還沒有找到用xarray做到這一點的方法。xarray相當於熊貓減/加

這是我如何從X尺寸減去大熊貓值2:

data = np.arange(0,6).reshape(2,3) 
xc = np.arange(0, data.shape[0]) 
yc = np.arange(0, data.shape[1]) 

df1 = pd.DataFrame(data, index=xc, columns=yc) 
df2 = df1.subtract(2, axis='columns') 

對於xarray雖然我不知道:

da1 = xr.DataArray(data, coords={'x': xc, 'y': yc}, dims=['x' , 'y']) 
da2 = ? 

回答

2

當你這樣做:

df1 = pd.DataFrame(data, index=xc, columns=yc) 
df2 = df1.subtract(2, axis='columns') 

你真的只是從整個數據集中減去2 ...

這裏是您的輸出從上方:

In [15]: df1 
Out[15]: 
    0 1 2 
0 0 1 2 
1 3 4 5 

In [16]: df2 
Out[16]: 
    0 1 2 
0 -2 -1 0 
1 1 2 3 

即相當於:

df3 = df1.subtract(2) 

In [20]: df3 

Out[20]: 
    0 1 2 
0 -2 -1 0 
1 1 2 3 

而且等效於:

df4 = df1 -2 

In [22]: df4 

Out[22]: 
    0 1 2 
0 -2 -1 0 
1 1 2 3 

因此,對於一個xarray數據陣列:

da1 = xr.DataArray(data, coords={'x': xc, 'y': yc}, dims=['x' , 'y']) 

da2 = da1-2 

In [24]: da1 

Out[24]: 
<xarray.DataArray (x: 2, y: 3)> 
array([[0, 1, 2], 
     [3, 4, 5]]) 
Coordinates: 
    * y  (y) int64 0 1 2 
    * x  (x) int64 0 1 

In [25]: da2 

Out[25]: 
<xarray.DataArray (x: 2, y: 3)> 
array([[-2, -1, 0], 
     [ 1, 2, 3]]) 
Coordinates: 
    * y  (y) int64 0 1 2 
    * x  (x) int64 0 1 

現在,如果您想從特定列中減去,這是一個不同的問題,我相信這將會需要分配索引。

1

在xarray中,您可以通過使用以尺寸名稱進行廣播來減去數組的行或列。

例如:

>>> foo = xarray.DataArray([[1, 2, 3], [4, 5, 6]], dims=['x', 'y']) 

>>> bar = xarray.DataArray([1, 4], dims='x') 

# subtract along 'x' 
>>> foo - bar 
<xarray.DataArray (x: 2, y: 3)> 
array([[0, 1, 2], 
     [0, 1, 2]]) 
Dimensions without coordinates: x, y 

>>> baz = xarray.DataArray([1, 2, 3], dims='y') 

# subtract along 'y' 
>>> foo - baz 
<xarray.DataArray (x: 2, y: 3)> 
array([[0, 0, 0], 
     [3, 3, 3]]) 
Dimensions without coordinates: x, y 

的使用方法類似,大熊貓提供,除了所希望的尺寸是由名稱引用axis='columns' VS axis='index'選項。