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