xarray 相当于 pandas 减法/加法

use*_*435 5 python-3.x pandas python-xarray

我正在寻找一种简洁的方法来对 DataArray 的单个维度进行算术运算,然后将结果作为新的 DataArray 返回(已更改和未更改的部分)。在 pandas 中,我会使用 df.subtract() 来执行此操作,但我还没有找到使用 xarray 执行此操作的方法。

以下是我如何从 pandas 的 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') 
Run Code Online (Sandbox Code Playgroud)

对于 xarray 虽然我不知道:

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

sho*_*yer 5

在 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
Run Code Online (Sandbox Code Playgroud)

axis='columns'这与 pandas 提供的vs选项类似axis='index',只不过所需的维度是通过名称引用的。


Mar*_*ina 3

当你这样做时:

df1 = pd.DataFrame(data, index=xc, columns=yc)
df2 = df1.subtract(2, axis='columns')
Run Code Online (Sandbox Code Playgroud)

你实际上只是从整个数据集中减去 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
Run Code Online (Sandbox Code Playgroud)

这相当于:

df3 = df1.subtract(2)

In [20]: df3

Out[20]: 
   0  1  2
0 -2 -1  0
1  1  2  3
Run Code Online (Sandbox Code Playgroud)

并相当于:

df4 = df1 -2

In [22]: df4

Out[22]: 
   0  1  2
0 -2 -1  0
1  1  2  3
Run Code Online (Sandbox Code Playgroud)

因此,对于 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
Run Code Online (Sandbox Code Playgroud)

现在,如果您想从特定列中减去,这是一个不同的问题,我认为这需要分配索引。