屏蔽阵列,每项操作和处理能力

时间:2015-09-17 12:49:29

标签: python arrays numpy

1)我想知道在带有掩码数组的操作中,是否在每项操作中的掩码值上进行操作(添加一个等),还是它们保持不变?

如果原始值

 nparray=[1,2,3,4]
 mask=ma.masked_array(nparray, mask=[-1]
 >>>mask [1,2,3,--]

将掩盖+ 1

>>>[2,3,4,--]

with - as 5或4(如果可以显示?*)?

2)我对迭代器和枚举器有同样的问题 我测试并看到索引是守恒的,但是我不知道是否处理了值或者只是跳过了值,或者是否跳过了掩码索引?

3)*是否有压制面具的手段,我无法在那里找到它:
http://docs.scipy.org/doc/numpy/reference/routines.ma.html

我的猜测是索引被处理而不被跳过,但是这些值是。
4)这是一种避免无用处理您不想处理的值的有效方法,还是在速度方面有更好的方法?

5)如果我在迭代时逐步修改掩码,这是否会导致某种异常?在Java中,它确实如此,但我只是Python的初学者。

2 个答案:

答案 0 :(得分:2)

执行MaskedArray += 1不会更改屏蔽值。您可以使用MaskedArray.data来检查完整数据数据:

In [26]: mymask
Out[26]: 
masked_array(data = [1 2 3 --],
             mask = [False False False  True],
       fill_value = 999999)

In [27]: mymask.data
Out[27]: array([1, 2, 3, 4])

In [28]: mymask+=1

In [29]: mymask
Out[29]: 
masked_array(data = [2 3 4 --],
             mask = [False False False  True],
       fill_value = 999999)

In [30]: mymask.data
Out[30]: array([2, 3, 4, 4])

修改 正如@JoeKington在评论中指出的那样,有些操作会修改屏蔽数据,例如np.add(mymask, 1, mymask),因此最好不要假设屏蔽数据不会被修改。

答案 1 :(得分:2)

屏蔽是一种处理类似Nan的值的便捷方式,您不希望通过summean等操作传播这些值。它不会加速计算。据我所知,它是用Python / numpy编写的,没有任何额外的编译代码。

考虑这两个时间测试。一个只是为数组的所有元素添加1。较慢的构造一个蒙版数组(所有值都被屏蔽)。从某种意义上说,它“跳过”所有元素 - 但速度要慢得多。

In [614]: %%timeit m=np.arange(1000)
   .....: m += 1
   .....: 
100000 loops, best of 3: 5.48 µs per loop
In [615]: %%timeit m=np.ma.masked_array(np.arange(1000),mask=[True])
m += 1
   .....: 
10000 loops, best of 3: 71.4 µs per loop

设置mask=[False]需要相同(慢)的时间。

布尔索引是跳过值的好方法。但即使这样也不会加快速度:

In [624]: %%timeit m=np.arange(1000)                              
m[m<500] += 1
   .....: 
100000 loops, best of 3: 17.5 µs per loop

使用基本切片索引的时间损失不是很大

In [628]: %%timeit m=np.arange(1000)
m[:500] += 1
   .....: 
100000 loops, best of 3: 9.2 µs per loop

numpy执行简单添加和编译代码等操作。即使在自己使用编译代码时,索引和屏蔽等步骤仍会增加处理时间。选择性地处理数组元素有充分的理由,但在简单计算上节省时间不是其中之一。