xarray和nparray,选择元素

问题描述

我今天才从R切换到python,所以很抱歉,如果我的问题可能不准确。

首先:我想做/拥有的事情: 我有一组x和y坐标,也是一个numpy数组。目标是获取与x和y给出的坐标相对应的特定元素:

import numpy as np
x=[0,1]
y=[0,1]
arr = np.array([[1,2],[3,4]])
arr[x,y]

结果是具有1和4的数组,正是我想要的。到目前为止很容易。但是现在我有一个变量,让我们称之为var,类型为xarray.core.variable.Variable 我想从中提取单个点,例如上面的numpy示例。我到目前为止发现的方式是

var = xr.DataArray.to_masked_array(var)

但是现在我得到了2个数组,一个带有值,另一个带有一些可疑的布尔元素。所以这是我的问题:

是否有可能将xarray的元素简化为numpy示例,或者是否存在将xarray.core.variable.Variable类型转换为numpy.ndarray快速方法

速度至关重要,因此没有循环!仅作为背景,我从中获取变量var的每个文件都是 大小为几GB,尺寸为(125,6,824,848)。因此,最好删除该布尔副本。

非常感谢您的帮助:)

解决方法

我认为您正在寻找Vectorized Indexing,xarray通过将DataArrays作为索引器来支持它。

从文档中复制:

In [37]: da = xr.DataArray(
   ....:     np.arange(12).reshape((3,4)),....:     dims=["x","y"],....:     coords={"x": [0,1,2],"y": ["a","b","c","d"]},....: )
   ....: 

In [38]: da
Out[38]: 
<xarray.DataArray (x: 3,y: 4)>
array([[ 0,2,3],[ 4,5,6,7],[ 8,9,10,11]])
Coordinates:
  * x        (x) int64 0 1 2
  * y        (y) <U1 'a' 'b' 'c' 'd'

In [39]: da[[0,1],[1,1]]
Out[39]: 
<xarray.DataArray (x: 2,y: 2)>
array([[1,[5,5]])
Coordinates:
  * x        (x) int64 0 1
  * y        (y) <U1 'b' 'b'

In [40]: ind_x = xr.DataArray([0,dims=["x"])

In [41]: ind_y = xr.DataArray([0,dims=["y"])

In [42]: da[ind_x,ind_y]  # orthogonal indexing
Out[42]: 
<xarray.DataArray (x: 2,y: 2)>
array([[0,[4,5]])
Coordinates:
  * x        (x) int64 0 1
  * y        (y) <U1 'a' 'b'

In [43]: da[ind_x,ind_x]  # vectorized indexing
Out[43]: 
<xarray.DataArray (x: 2)>
array([0,5])
Coordinates:
  * x        (x) int64 0 1
    y        (x) <U1 'a' 'b'