2015-11-07 95 views
2

我是一个新的python用户,我深入了解NumPy模块的工作原理。我正在写一个函数,它能够使用被屏蔽和未被屏蔽的数组作为数据输入。 我注意到有几个numpy masked operations看起来与其正常的(未掩盖的)对应物相似(甚至工作?)。其中一项功能是numpy.zerosnumpy.ma.zeros。有人能告诉我使用numpy.ma.zerosnumpy.zeros创建阵列的优势吗?当你使用屏蔽数组时,它会产生实际的差异吗?我注意到,当我使用numpy.zeros_like时,它可以正常工作,用于创建一个掩码或未掩码的数组。Numpy蒙面操作

+0

为什么downvote?我在numpy网页上找不到关于此问题的任何有用信息。 – hurrdrought

回答

3

np.ma.zeros创建一个被屏蔽的数组而不是一个正常的数组,如果后面的某个操作对这个数组创建了无效值,这可能很有用。手册中的示例:

数组有时包含无效或缺失的数据。在对这样的阵列执行 操作时,我们希望抑制无效值,其中 是掩码阵列满足的目的(典型使用示例是 ,下面给出)。

例如,检查下面的数组:

>>> x = np.array([2, 1, 3, np.nan, 5, 2, 3, np.nan]) 

当我们试图以计算数据的平均值,其结果是 未确定:

>>> np.mean(x) nan 

平均使用大致np.sum(x)/len(x)计算,但由于 任何编号添加到NaN产生NaN,这是行不通的。 输入蒙面阵列:

>>> m = np.ma.masked_array(x, np.isnan(x)) 
>>> m 
masked_array(data = [2.0 1.0 3.0 -- 5.0 2.0 3.0 --], 
     mask = [False False False True False False False True], 
     fill_value=1e+20) 

在这里,我们构建了一个蒙面阵列抑制所有NaN值。 我们现在可以着手计算其他值的平均值:

>>> np.mean(m) 
2.6666666666666665 
+0

谢谢你的明确解释。其实,在我的函数中,我使用'np.ma.mean'来代替'np.mean',因为你解释过的原因。我只是痴迷于理解'numpy.ma'类,特别是创建由0和1填充的数组。谢谢! – hurrdrought

1

作为一个初学者不要太陷入了蒙面阵列。它是np.ndarray的一个子类,在处理具有某些在计算诸如平均值之类的内容时不希望忽略的错误值的数据时非常有用。但除此之外,您应该关注基础numpy类的创建和索引(以及计算)。

不仅是ma数组的一个子类,它包含2个常规数组。一个人拥有数据,包括任何“不良”的价值观。这是一个普通的numpy数组。另一个是布尔数组,掩码。蒙面类的开发人员试图使它的行为与常规数组相同,但是添加了这种蒙版。大部分(如果不是全部的话)被屏蔽的数组的附加功能都是在Python代码中实现的。

很难理解numpy的底层C代码,但看看在Python中实现的函数和方法是有益的。我经常在ipython会话中看看那些,但是他们也可以在numpy的github存储库中学习。

+0

感谢您的指导性意见。我也在用'numpy'学习_indexing_,因为它似乎是我需要建立高效函数(比如说矢量化)的一项主要技能。我只是沉迷于试图理解'numpy'阵列的'幕后'。谢谢! – hurrdrought