python – 稀疏DataArray Xarray搜索

在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.实际上等于-0.009876之类的东西?

最佳答案
(回答主要问题)

你快到了.但是,轻微的语法差异在这里有很大的不同.一方面,这里是使用“基于值”的掩码过滤> 0值的解决方案.

# if you want to DROP values which do not suffice a mask condition
first_image_xarray[:,0].where(first_image_xarray[:,0] > 0,drop=True)

要么

# if you want to KEEP values which do not suffice a mask condition as nan
first_image_xarray[:,np.nan)

另一方面,你的尝试没有按照你的希望工作的原因是因为在first_image_xarray.x中,它指的是数组中元素的索引(在x方向上)而不是引用元素的值.因此,只有输出的第一个元素应该是nan而不是0,因为它只不足以满足切片[:,0]中的掩码条件.是的,您正在创建一个“基于索引”的掩码.

以下小型实验(希望如此)阐明了这一重要区别.

假设我们有DataArray,它只包含0和1(维度与问题的原始帖子(OP)(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,96)),dims=('x','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]

Out:

使用上面的掩模,只有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].where(a[:,drop=True)

Out:

这成功地删除了所有不足以基于DataArray元素的值的掩码条件的值.

(回答问题)

至于DataArray中-0和0的原点,从负侧或正侧向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:

另外,在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应该是手动的和有意的而不是自动的.预处理阶段.

希望这可以帮助.

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...