【问题标题】:xarray and nparray, picking elementsxarray 和 nparray,挑选元素
【发布时间】:2021-01-03 20:00:47
【问题描述】:

我今天刚从 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)。所以摆脱那个布尔副本会很好。

非常感谢您的帮助:)

【问题讨论】:

  • 为什么要用.to_masked_array

标签: python-3.x numpy python-xarray


【解决方案1】:

我认为您正在寻找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,  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'

【讨论】:

  • 这正是我想要的,非常感谢:)
  • 我不明白为什么你在向量化的情况下有两次 ind_x,或者这是如何触发不同的行为。我仍然需要使用那些 y 坐标,那么如果语法与正交索引情况相同,我该如何使用它们?
猜你喜欢
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2017-04-01
  • 2020-08-01
相关资源
最近更新 更多