2017-05-03 80 views
2

我正在使用屏蔽数组感谢我在stackoverflow上获得的一些帮助,但是我遇到了屏蔽数组的np.where评估问题。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]),) 

使用掩膜的整个要点是避免访问是“空白”指数,这样我怎么能使用其中(或其他函数)只检索未被屏蔽的索引,并匹配我的布尔条件。

+0

你是从'numpy.ma'子模块,而不是试图'ma.where()'?它会产生不同的结果吗? – blubberdiblub

+0

请显示您的完整代码。在一个例子中,我把所有东西都按预期工作。 –

+3

'[1 - 3 0 4 7 6 5]'不是一个有效的numpy对象。你指的是什么真正的对象? – Kasramvd

回答

4

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

碘。E:

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

这是解决方案,但请阅读[我的评论](http://stackoverflow.com/questions/43761425/np-where-and-masked-array?noredirect=1#comment74565203_43761425)出于这种行为的原因。 – Kasramvd

+0

@Kasramvd我不认为这是明确的。 'np.polyfit()'对于屏蔽数组也不能正常工作,并且一个计算,而不是比较。 – blubberdiblub

+0

是的,它做了一些计算。虽然它仍然有一些比较(与拟合多项式的程度),但这没有什么区别,我认为这是文档中的一个错误。 – Kasramvd

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属性。 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]'