Numpy蒙面操作

时间:2015-11-07 05:36:44

标签: python arrays numpy

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

作为初学者,不要陷入蒙面阵列的困境。它是SHA-256的子类,在处理具有一些错误值的数据时非常有用,在计算平均值时,您希望忽略这些值。但是否则你应该专注于使用基本numpy类创建和索引(和计算)。

np.ndarray数组不仅是一个子类,还包含2个常规数组。一个人有数据,包括任何'坏'值。这是一个常规的numpy数组。另一个是布尔数组,即掩码。被屏蔽类的开发人员试图使其行为与常规数组的行为相同,但是使用了这个添加的屏蔽。掩码数组的大多数(如果不是全部)增加的功能都是用Python代码实现的。

很难理解ma的底层C代码,但是查看Python中实现的函数和方法是有益的。我经常在numpy会话中查看它们,但也可以在numpy github存储库中进行研究。