gpt4 book ai didi

python - 稀疏 DataArray Xarray 搜索

转载 作者:行者123 更新时间:2023-12-04 20:28:32 25 4
gpt4 key购买 nike

在 xarray 中使用 DataArray 对象是查找所有具有值 != 0 的单元格的最佳方法。

例如在 Pandas 我会做

df.loc[df.col1 > 0]

我的具体例子是我试图查看 3 维大脑成像数据。
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的解决方案值使用 “基于值(value)”面具。

# 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其中仅包含 01 (维度与问题 (140,140,96) 的原始帖子(OP)对齐)。首先让我们根据 屏蔽它索引正如 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

使用上面的掩码,只有 所在的元素索引两者的 xy0转入 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元素。

(回答侧面问题)

至于 -0的由来和 0DataArray ,从负侧或正侧向 0 取整的值将是可能性:这里进行了相关讨论 How to eliminate the extra minus sign when rounding negative numbers towards zero in 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

作为旁注,获得 -0 的另一种可能性在 NumPy 数组中可以是 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在数据准备和预处理阶段应该是手动和有意的,而不是自动的。

希望这可以帮助。

关于python - 稀疏 DataArray Xarray 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51802054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com