Python 屏蔽阵列、每项操作和处理能力
1) 我想知道,在一个带有屏蔽数组的操作中,是在每项操作(添加一个等)中对屏蔽值执行操作,还是保持不变 如果原始值为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) 我对迭代器和枚举器有同样的问题,正如 我测试并看到索引是守恒的,但我不知道是否处理了值
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