np.where和蒙面数组

时间:2017-05-03 13:26:03

标签: python arrays numpy boolean-operations masked-array

由于我在stackoverflow上获得了一些帮助,我使用了蒙面数组,但是我遇到了对掩码数组进行np.where评估的问题。

我的蒙面数组是:

m_pt0 = np.ma.masked_array([1, 2, 3, 0, 4, 7, 6, 5],
                           mask=[False, True, False, False,
                                 False, False, False, False])

并打印出这样的:

In [24]: print(m_pt0)
[1 -- 3 0 4 7 6 5]

我正在寻找m_pt0中的索引,其中m_pt0 = 0,我希望

np.where(0 == m_pt0)

将返回:

(array([3]))

然而,尽管有面具(或因为?),我反而得到

(array([1, 3]),)

使用掩码的整个要点是避免访问" blank"的索引,那么我如何使用where(或其他函数)来仅检索未屏蔽的索引并匹配我的布尔标准

2 个答案:

答案 0 :(得分:5)

您需要使用where()函数的屏蔽变体,否则它将为屏蔽数组返回错误或不需要的结果。其他功能也是如此,例如polyfit()

予。 E:

In [2]: np.ma.where(0 == m_pt0)
Out[2]: (array([3]),)

答案 1 :(得分:2)

平等测试可能会造成混淆。结果是另一个蒙版数组:

In [19]: 0 == m_pt0
Out[19]: 
masked_array(data = [False -- False True False False False False],
             mask = [False  True False False False False False False],
       fill_value = True)

屏蔽数组具有.data.mask属性。不了解MA的numpy个函数只能看到.data

In [20]: _.data
Out[20]: array([False,  True, False,  True, False, False, False, False], dtype=bool)

np.where看到2 True,然后返回

In [23]: np.where(0 == m_pt0)
Out[23]: (array([1, 3], dtype=int32),)
In [24]: np.where((0 == m_pt0).data)
Out[24]: (array([1, 3], dtype=int32),)

在可能的情况下,最好使用函数的np.ma版本:

In [25]: np.ma.where(0 == m_pt0)
Out[25]: (array([3], dtype=int32),)

查看np.source(np.ma.where)的代码,我看到它

if missing == 2:
    return filled(condition, 0).nonzero()
(plus lots of code for the 3 argument use)

filled确实:

In [27]: np.ma.filled((0 == m_pt0),0)
Out[27]: array([False, False, False,  True, False, False, False, False], dtype=bool)

MA函数通常用无关紧要的东西替换掩盖的值(在这种情况下为0),或使用compressed将它们从考虑中删除。

In [36]: m_pt0.compressed()
Out[36]: array([1, 3, 0, 4, 7, 6, 5])
In [37]: m_pt0.filled(100)
Out[37]: array([  1, 100,   3,   0,   4,   7,   6,   5])

如果一个numpy函数将工作委托给数组自己的方法,它将在MA上正常工作。

In [41]: np.nonzero(m_pt0)
Out[41]: (array([0, 2, 4, 5, 6, 7], dtype=int32),)
In [42]: m_pt0.nonzero()
Out[42]: (array([0, 2, 4, 5, 6, 7], dtype=int32),)
In [43]: np.where(m_pt0)
Out[43]: (array([0, 1, 2, 4, 5, 6, 7], dtype=int32),)

np.nonzero代表。 np.where没有。

蒙版数组的repr显示蒙版。它的str只显示屏蔽数据:

In [31]: m_pt0
Out[31]: 
masked_array(data = [1 -- 3 0 4 7 6 5],
             mask = [False  True False False False False False False],
       fill_value = 999999)
In [32]: str(m_pt0)
Out[32]: '[1 -- 3 0 4 7 6 5]'