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

Python 屏蔽阵列、每项操作和处理能力,python,arrays,numpy,Python,Arrays,Numpy,1) 我想知道,在一个带有屏蔽数组的操作中,是在每项操作(添加一个等)中对屏蔽值执行操作,还是保持不变 如果原始值为 nparray=[1,2,3,4] mask=ma.masked_array(nparray, mask=[-1] >>>mask [1,2,3,--] 蒙版+1会被激活吗 >>>[2,3,4,--] 使用--as 5或4(如果可以显示?*) 2) 我对迭代器和枚举器有同样的问题,正如 我测试并看到索引是守恒的,但我不知道是否处理了值

1) 我想知道,在一个带有屏蔽数组的操作中,是在每项操作(添加一个等)中对屏蔽值执行操作,还是保持不变

如果原始值为

 nparray=[1,2,3,4]
 mask=ma.masked_array(nparray, mask=[-1]
 >>>mask [1,2,3,--]
蒙版+1会被激活吗

>>>[2,3,4,--]
使用--as 5或4(如果可以显示?*)

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

3) *是否有办法抑制面具,我在那里找不到:

我猜索引是经过处理的,不会被跳过,但值是经过处理的。
4) 这是一种有效的方法来避免对不希望处理的值进行无用的处理,还是在速度方面有更好的方法


5) 如果我在迭代时增量修改掩码,这会导致某种异常吗?在Java中是这样的,但我只是Python的初学者。

执行
MaskedArray+=1
不会更改掩码值。您可以使用访问完整的数据阵列来检查以下内容:

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
不会更改屏蔽值。您可以使用访问完整的数据阵列来检查以下内容:

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)
,因此,最好不要假设屏蔽的数据不会被修改。

屏蔽是一种方便的方法,可以处理类似于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

numpy
使用编译后的代码进行简单的加法运算。索引和屏蔽等步骤,即使使用编译代码本身,仍然会增加处理时间。选择性地处理数组元素有很好的理由,但节省简单计算的时间并不是其中之一。

掩蔽是一种方便的方法,可以处理类似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

numpy
使用编译后的代码进行简单的加法运算。索引和屏蔽等步骤,即使使用编译代码本身,仍然会增加处理时间。选择性地处理数组元素有很好的理由,但节省简单计算的时间并不是其中之一。

为什么你不能检查它呢?这对1和2有效,但对3-5无效(“我说了例外,但可能有看不见的问题”)。另外,在我考虑我的算法时,我没有访问python。我写评论时你没有3-5,不管怎样,你现在有了一些很好的答案。为什么你不能检查一下呢?这对1和2是有效的,但对3-5,我真的不能('我说了例外,但可能有看不见的问题)。另外,在我考虑我的算法时,我还没有访问python。我写评论时你没有3-5,不管怎样,你现在有了一些很好的答案。值得一提的是,有些情况下屏蔽的数据被更改了
mymask+=1
不会修改屏蔽数据,但是
np.add(mymask,1,mymask)
会修改。最好不要依赖于蒙面部分没有被改变。很好的补充,我也会寻找这个。谢谢@JoeKington,我已经在我的回答中添加了这些信息。因为它的价值,有些情况下蒙面数据被改变了
mymask+=1
不会修改屏蔽数据,但是
np.add(mymask,1,mymask)
会修改。最好不要依赖蒙面部分不被改变。很好的补充,我也会寻找这个。谢谢@JoeKington,我已经在我的回答中添加了这些信息非常有用的见解,非常感谢。我的问题是,我必须处理一个数组,通过迭代选择它的元素,问题是数组长度可能非常大,包含10位或更多的数字,它认为90%的“无用”数字是我可能希望在操作中避免使用的。问题是我需要一个并行的常量索引,但是一个词汇表的执行速度要慢得多。我曾想过使用一个ndarray,但实际上,我需要不同类型的值,所以我想我会坚持使用这个(或者可能并行使用两个数组?)非常有用的见解,非常感谢。我的问题是,我必须处理一个数组,通过迭代选择它的元素,问题是数组长度可能非常大,包含10位或更多的数字,它认为90%的“无用”数字是我可能希望在操作中避免使用的。问题是我需要一个并行的常量索引,但是一个词汇表的执行速度要慢得多。我想用ndar