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的初学者。
答案 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的值的便捷方式,您不希望通过sum
和mean
等操作传播这些值。它不会加速计算。据我所知,它是用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
执行简单添加和编译代码等操作。即使在自己使用编译代码时,索引和屏蔽等步骤仍会增加处理时间。选择性地处理数组元素有充分的理由,但在简单计算上节省时间不是其中之一。