Python 3.x 如何在xarray中为多索引分配新坐标

Python 3.x 如何在xarray中为多索引分配新坐标,python-3.x,matplotlib,python-xarray,Python 3.x,Matplotlib,Python Xarray,我正在尝试为xarray DataArray的多索引分配新的坐标 我有一个dataArray,它包含两个主要维度(“经度”、“纬度”)和一个多索引(“状态”) 以下是DataArray结构: print(dataArray) <xarray.DataArray (longitude: 5000, latitude: 3000)> array([[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan,

我正在尝试为xarray DataArray的多索引分配新的坐标

我有一个dataArray,它包含两个主要维度(“经度”、“纬度”)和一个多索引(“状态”)

以下是DataArray结构:

print(dataArray)

<xarray.DataArray (longitude: 5000, latitude: 3000)>
array([[nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       ...,
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan]])
Coordinates:
  * longitude  (longitude) float64 -145.0 -145.0 -144.9 ... -15.05 -15.03 -15.0
  * latitude   (latitude) float64 -85.0 -84.96 -84.93 ... 24.93 24.96 25.0
    states     (latitude, longitude) float64 nan nan nan nan ... nan nan nan nan
理想情况下,我希望将DataArray结构作为以下两个选项之一:

备选方案1)

数组([[nan,nan,nan,…,nan,nan,nan],
[楠,楠,楠,…,楠,楠,楠],
[楠,楠,楠,…,楠,楠,楠],
...,
[楠,楠,楠,…,楠,楠,楠],
[楠,楠,楠,…,楠,楠,楠],
[nan,nan,nan,…,nan,nan,nan]]
协调:
*经度(经度)浮动64-145.0-145.0-144.9-15.05 -15.03 -15.0
*纬度(纬度)浮动64-85.0-84.96-84.93。。。24.93 24.96 25.0
国家(纬度,经度)字符串巴西,美国德国。。。
备选方案2)

数组([[nan,nan,nan,…,nan,nan,nan],
[楠,楠,楠,…,楠,楠,楠],
[楠,楠,楠,…,楠,楠,楠],
...,
[楠,楠,楠,…,楠,楠,楠],
[楠,楠,楠,…,楠,楠,楠],
[nan,nan,nan,…,nan,nan,nan]]
协调:
*经度(经度)浮动64-145.0-145.0-144.9-15.05 -15.03 -15.0
*纬度(纬度)浮动64-85.0-84.96-84.93。。。24.93 24.96 25.0
州(纬度,经度)浮动64南。。。楠楠楠楠楠楠
命名_州(纬度、经度)字符串巴西、美国和德国。。。

以下是替换坐标值的一种方法:

temp = 15 + 8 * np.random.randn(2, 2, 3)
precip = 10 * np.random.rand(2, 2, 3)
lon = [[-99.83, -99.32], [-99.79, -99.23]]
lat = [[42.25, 42.21], [42.63, 42.59]]
states = [[1,2],[3,2]]

ds = xr.Dataset({'temperature': (['x', 'y', 'time'],  temp),
        'precipitation': (['x', 'y', 'time'], precip)},
        coords={'lon': (['x', 'y'], lon),
        'lat': (['x', 'y'], lat),
        'time': pd.date_range('2014-09-06', periods=3),
        'states': (['x','y'], states)})

ds

尺寸:(时间:3,x:2,y:2)
协调:
lon(x,y)浮动64-99.83-99.32-99.79-99.23
横向(x,y)浮动64 42.25 42.21 42.63 42.59
*时间日期时间64[ns]2014-09-06 2014-09-07 2014-09-08

状态(x,y)以下是替换坐标值的一种方法:

temp = 15 + 8 * np.random.randn(2, 2, 3)
precip = 10 * np.random.rand(2, 2, 3)
lon = [[-99.83, -99.32], [-99.79, -99.23]]
lat = [[42.25, 42.21], [42.63, 42.59]]
states = [[1,2],[3,2]]

ds = xr.Dataset({'temperature': (['x', 'y', 'time'],  temp),
        'precipitation': (['x', 'y', 'time'], precip)},
        coords={'lon': (['x', 'y'], lon),
        'lat': (['x', 'y'], lat),
        'time': pd.date_range('2014-09-06', periods=3),
        'states': (['x','y'], states)})

ds

尺寸:(时间:3,x:2,y:2)
协调:
lon(x,y)浮动64-99.83-99.32-99.79-99.23
横向(x,y)浮动64 42.25 42.21 42.63 42.59
*时间日期时间64[ns]2014-09-06 2014-09-07 2014-09-08

州(x,y)亲爱的生物武器公约,谢谢你的归来。似乎没有简单的方法来广播映射操作。如果能加快速度那就太好了。尽管如此,您的解决方案确实很好。它解决了这个问题。我将继续关注某种连接、合并或分配坐标的方法。亲爱的BWC,谢谢你的回复。似乎没有简单的方法来广播映射操作。如果能加快速度那就太好了。尽管如此,您的解决方案确实很好。它解决了这个问题。我仍将重点讨论某种连接、合并或分配_坐标的方法。
 <xarray.DataArray (longitude: 5000, latitude: 3000)>
    array([[nan, nan, nan, ..., nan, nan, nan],
           [nan, nan, nan, ..., nan, nan, nan],
           [nan, nan, nan, ..., nan, nan, nan],
           ...,
           [nan, nan, nan, ..., nan, nan, nan],
           [nan, nan, nan, ..., nan, nan, nan],
           [nan, nan, nan, ..., nan, nan, nan]])
    Coordinates:
      * longitude  (longitude) float64 -145.0 -145.0 -144.9 ... -15.05 -15.03 -15.0
      * latitude   (latitude) float64 -85.0 -84.96 -84.93 ... 24.93 24.96 25.0
        states     (latitude, longitude) float64 nan nan nan nan ... nan nan nan nan
        Named_states     (latitude, longitude) string Brazil, USA Germany ...
temp = 15 + 8 * np.random.randn(2, 2, 3)
precip = 10 * np.random.rand(2, 2, 3)
lon = [[-99.83, -99.32], [-99.79, -99.23]]
lat = [[42.25, 42.21], [42.63, 42.59]]
states = [[1,2],[3,2]]

ds = xr.Dataset({'temperature': (['x', 'y', 'time'],  temp),
        'precipitation': (['x', 'y', 'time'], precip)},
        coords={'lon': (['x', 'y'], lon),
        'lat': (['x', 'y'], lat),
        'time': pd.date_range('2014-09-06', periods=3),
        'states': (['x','y'], states)})

ds
<xarray.Dataset>
Dimensions:        (time: 3, x: 2, y: 2)
Coordinates:
    lon            (x, y) float64 -99.83 -99.32 -99.79 -99.23
    lat            (x, y) float64 42.25 42.21 42.63 42.59
  * time           (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
    states         (x, y) int64 1 2 3 2
Dimensions without coordinates: x, y
Data variables:
    temperature    (x, y, time) float64 1.096 19.28 16.27 ... 19.25 20.38 4.981
    precipitation  (x, y, time) float64 9.09 7.486 2.288 ... 3.639 0.6625 8.19
transdict = {'1':'Brazil', '2':'Germany', '3':'USA'} # need dictionary for all mappings
ds.states.values = ds.states.astype(str)

for key, value in transdict.items():
    ds.states.values = np.where(ds.states.values == key, value, ds.states.values)
    ds
<xarray.Dataset>
Dimensions:        (time: 3, x: 2, y: 2)
Coordinates:
    lon            (x, y) float64 -99.83 -99.32 -99.79 -99.23
    lat            (x, y) float64 42.25 42.21 42.63 42.59
  * time           (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
    states         (x, y) <U21 'Brazil' 'Germany' 'USA' 'Germany'
Dimensions without coordinates: x, y
Data variables:
    temperature    (x, y, time) float64 1.096 19.28 16.27 ... 19.25 20.38 4.981
    precipitation  (x, y, time) float64 9.09 7.486 2.288 ... 3.639 0.6625 8.19