xarray 和 nparray,拾取元素
xarray and nparray, picking elements
我今天才从 R 切换到 python,如果我的问题可能不准确,很抱歉。
第一:我想要的do/have:
我有一组 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 个数组,一个包含值,一个包含一些可疑的布尔元素。所以这是我的问题:
是否有可能获得类似于 numpy 示例的 xarray 元素,或者,是否有快速的方法将 xarray.core.variable.Variable 类型转换为 numpy.ndarray?
速度至关重要,所以没有循环!仅作为背景,我从中获取变量 var 的每个文件是
几 GB 大小,维度为 (125,6,824,848)。所以最好去掉那个布尔值副本。
非常感谢您的帮助:)
我认为您正在寻找 Vectorized Indexing,xarray 通过将 DataArray 作为索引器传递来支持它。
从文档中复制:
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, 1, 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, 1],
[5, 5]])
Coordinates:
* x (x) int64 0 1
* y (y) <U1 'b' 'b'
In [40]: ind_x = xr.DataArray([0, 1], dims=["x"])
In [41]: ind_y = xr.DataArray([0, 1], dims=["y"])
In [42]: da[ind_x, ind_y] # orthogonal indexing
Out[42]:
<xarray.DataArray (x: 2, y: 2)>
array([[0, 1],
[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'
我今天才从 R 切换到 python,如果我的问题可能不准确,很抱歉。
第一:我想要的do/have: 我有一组 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 个数组,一个包含值,一个包含一些可疑的布尔元素。所以这是我的问题:
是否有可能获得类似于 numpy 示例的 xarray 元素,或者,是否有快速的方法将 xarray.core.variable.Variable 类型转换为 numpy.ndarray?
速度至关重要,所以没有循环!仅作为背景,我从中获取变量 var 的每个文件是 几 GB 大小,维度为 (125,6,824,848)。所以最好去掉那个布尔值副本。
非常感谢您的帮助:)
我认为您正在寻找 Vectorized Indexing,xarray 通过将 DataArray 作为索引器传递来支持它。
从文档中复制:
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, 1, 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, 1],
[5, 5]])
Coordinates:
* x (x) int64 0 1
* y (y) <U1 'b' 'b'
In [40]: ind_x = xr.DataArray([0, 1], dims=["x"])
In [41]: ind_y = xr.DataArray([0, 1], dims=["y"])
In [42]: da[ind_x, ind_y] # orthogonal indexing
Out[42]:
<xarray.DataArray (x: 2, y: 2)>
array([[0, 1],
[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'