![](/img/trans.png)
[英]renaming __xarray_dataarray_variable__ in xarray dataarray
[英]Sparse DataArray Xarray search
在xarray中使用DataArray对象,找到具有值的所有单元格的最佳方法是!= 0。
例如在熊猫中我会这样做
df.loc[df.col1 > 0]
我的具体例子我正在试着看三维脑成像数据。
first_image_xarray.shape
(140, 140, 96)
dims = ['x','y','z']
查看xarray.DataArray.where的文档,看起来我想要这样的东西:
first_image_xarray.where(first_image_xarray.y + first_image_xarray.x > 0,drop = True)[:,0,0]
但我仍然得到零的数组。
<xarray.DataArray (x: 140)>
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0., 0., -0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
Dimensions without coordinates: x
另外 - 一个侧面的问题 - 为什么有一些负零? 这些值是否舍入为-0。 实际上等于-0.009876之类的东西?
(回答主要问题)
你快到了。 但是,轻微的语法差异在这里有很大的不同。 一方面,这里是使用“基于值”的掩码过滤>0
值的解决方案。
# if you want to DROP values which do not suffice a mask condition
first_image_xarray[:,0,0].where(first_image_xarray[:,0,0] > 0, drop=True)
要么
# if you want to KEEP values which do not suffice a mask condition as nan
first_image_xarray[:,0,0].where(first_image_xarray[:,0,0] > 0, np.nan)
另一方面,你的尝试没有按照你的希望工作的原因是因为在first_image_xarray.x
,它指的是数组中元素的索引 (在x
方向上)而不是引用元素的值 。 因此,只有输出的第一个元素应该是nan
而不是0
因为它只不足以满足切片[:,0,0]
的掩码条件。 是的,您正在创建一个“基于索引”的掩码。
以下小型实验(希望如此)阐明了这一重要区别。
假设我们有DataArray
,它只包含0
和1
(维度与问题的原始帖子(OP) (140,140,96)
)。 首先让我们来掩盖它基于指数 OP做的:
import numpy as np
import xarray as xr
np.random.seed(0)
# create a DataArray which randomly contains 0 or 1 values
a = xr.DataArray(np.random.randint(0, 2, 140*140*96).reshape((140, 140, 96)), dims=('x', 'y', 'z'))
# with this "index-based" mask, only elements where index of both x and y are 0 are replaced by nan
a.where(a.x + a.y > 0, drop=True)[:,0,0]
Out:
<xarray.DataArray (x: 140)>
array([ nan, 0., 1., 1., 0., 0., 0., 1., 0., 0., 0., 0.,
0., 1., 0., 1., 0., 1., 0., 0., 0., 1., 0., 0.,
1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 0., 1.,
1., 0., 0., 0., 1., 1., 1., 0., 0., 1., 0., 0.,
1., 0., 1., 1., 0., 0., 1., 0., 0., 1., 1., 1.,
0., 0., 0., 1., 1., 0., 1., 0., 1., 1., 0., 0.,
0., 0., 1., 1., 0., 1., 1., 1., 1., 0., 1., 0.,
0., 0., 0., 0., 0., 0., 1., 0., 1., 1., 0., 0.,
0., 0., 1., 0., 1., 0., 0., 0., 0., 1., 0., 1.,
0., 0., 1., 0., 0., 0., 0., 0., 1., 1., 0., 0.,
0., 1., 0., 0., 1., 0., 0., 1.])
Dimensions without coordinates: x
使用上面的掩码,只有x
和y
索引都为0
的元素才会转为nan
,而其余部分根本没有被改变或掉落。
相反,所提出的方案掩模DataArray
基于所述值 DataArray
的元素。
# with this "value-based" mask, all the values which do not suffice the mask condition are dropped
a[:,0,0].where(a[:,0,0] > 0, drop=True)
Out:
<xarray.DataArray (x: 65)>
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1., 1., 1., 1.])
Dimensions without coordinates: x
这成功地删除了所有不足以基于DataArray
元素的值的掩码条件的值 。
(回答问题)
至于DataArray
中-0
和0
的原点,从负侧或正侧向0
舍入值将是可能的:在此处进行相关讨论如何在numpy中将负数舍入为零时消除额外减号? 以下是此案例的一个小例子。
import numpy as np
import xarray as xr
xr_array = xr.DataArray([-0.1, 0.1])
# you can use either xr.DataArray.round() or np.round() for rounding values of DataArray
xr.DataArray.round(xr_array)
Out:
<xarray.DataArray (dim_0: 2)>
array([-0., 0.])
Dimensions without coordinates: dim_0
np.round(xr_array)
Out:
<xarray.DataArray (dim_0: 2)>
array([-0., 0.])
Dimensions without coordinates: dim_0
另外,在NumPy数组中获取-0
的另一种可能是numpy.set_printoptions(precision=0)
,它隐藏在小数点之下,如下所示(但我知道这次不是这种情况,因为你使用的是DataArray
) :
import numpy as np
# default value is precision=8 in ver1.15
np.set_printoptions(precision=0)
np.array([-0.1, 0.1])
Out:
array([-0., 0.])
无论如何,我最好的猜测是在数据准备和预处理阶段,转换为-0
应该是手动的和有意的而不是自动的。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.