如何在Numpy中为带掩码的数组创建直方图?

17 投票
4 回答
11691 浏览
提问于 2025-04-16 03:32

在Numpy 1.4.1中,计算一个被屏蔽数组的直方图,最简单或者最有效的方法是什么呢?其实,numpy.histogrampyplot.hist默认情况下会计算被屏蔽的元素!

我现在能想到的唯一简单的解决办法是创建一个只包含未被屏蔽值的新数组:

histogram(m_arr[~m_arr.mask])

不过,这样做效率不高,因为这会不必要地创建一个新数组。我很乐意看到更好的想法!

4 个回答

6

这个问题已经很久了,但现在我通常用这个方法:

numpy.histogram(m_arr, bins=.., range=.., density=False, weights=m_arr_mask)

这里的 m_arr_mask 是一个和 m_arr 形状相同的数组,里面的值是 0 和 1。0 表示要从直方图中排除的 m_arr 元素,1 则表示要包含在内的元素。

9

试试用 hist(m_arr.compressed()) 这个命令。

16

(根据上面的讨论,重新发布这个内容...)

我不太确定numpy的开发者会把这个当成一个错误,还是认为这是正常的行为。我在邮件列表上问过,所以我们看看他们怎么说吧。

无论如何,这个问题很容易解决。只需要在numpy/lib/function_base.py文件中,把函数输入的numpy.asarray改成numpy.asanyarray,这样就能正确使用带掩码的数组(或者其他ndarray的子类),而不需要创建一个副本。

编辑:看起来这是正常的行为。在这里讨论过

如果你想忽略被掩码的数据,只需多调用一个函数:

histogram(m_arr.compressed())

我觉得这会多创建一个副本并不重要,因为我猜在直方图中完全处理掩码数组会更复杂。

使用asanyarray也能让矩阵和其他可能在直方图计算中处理不当的子类型正常工作。

除了丢弃被掩码的观察值外,还需要弄清楚掩码数组的直方图定义是什么,正如Bruce所指出的。

撰写回答