由于我在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(或其他函数)来仅检索未屏蔽的索引并匹配我的布尔标准
答案 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]'