Python,希望从掩码数组中提取值,然后重建数组

时间:2016-04-30 16:42:34

标签: python numpy

我正在写一些涉及很多噪音的东西,我试图删除,但为了做到这一点,我最初使用了掩码,但我使用掩码分析数据的方式。

完成屏蔽,我想提取未屏蔽的数据,对此进行分析,然后用原始顺序重建数组。

array([[3, 0, 3],
       [6, 7, 2],
       [2, 5, 0],
       [2, 1, 4]])

制作面具

array([[-, -, -],
       [6, 7, 2],
       [-, -, -],
       [2, 1, 4]])

提取值

array([[6, 7, 2],
       [2, 1, 4]])

做分析

重建阵列

array([[-, -, -],
       [6, 7, 2],
       [-, -, -],
       [2, 1, 4]])

我希望有一种有效的方法,因为我处理的是1亿个数据点。任何建议都表示赞赏。

3 个答案:

答案 0 :(得分:4)

您可以使用

masked[~masked.mask] = analyzed.ravel()

将分析的值重新分配给屏蔽数组。

import numpy as np

arr = np.array([[3, 0, 3],
                [6, 7, 2],
                [2, 5, 0],
                [2, 1, 4]])

masked = np.ma.masked_array(arr, mask=False)
masked.mask[::2, None] = True

extracted = np.ma.compress_rows(masked)

analyzed = extracted*10

masked[~masked.mask] = analyzed.ravel()

print(masked)

产量

[[-- -- --]
 [60 70 20]
 [-- -- --]
 [20 10 40]]

答案 1 :(得分:2)

屏蔽数组具有compress(ed)方法,可以提取未屏蔽的值 - 作为1d数组(因为通常屏蔽可能是不规则的)。但我不确定将新值放回原始值(或具有相同形状和掩码的数组)的方法。 (看起来unutbu已经涵盖了这一步)

许多蒙面方法使用filled()暂时将数据转换为常规numpy方法使用的内容。例如,sum的蒙版版本可以用0替换蒙版值。具有1s的产品。适当的填充值将随操作而不同。

In [86]: Am=np.ma.masked_less(A,3)

In [87]: Am
Out[87]: 
masked_array(data =
 [[3 -- 3]
 [6 7 --]
 [-- 5 --]
 [-- -- 4]],
             mask =
 [[False  True False]
 [False False  True]
 [ True False  True]
 [ True  True False]],
       fill_value = 999999)

In [88]: Am.compressed()
Out[88]: array([3, 3, 6, 7, 5, 4])

In [89]: Am.filled(999)
Out[89]: 
array([[  3, 999,   3],
       [  6,   7, 999],
       [999,   5, 999],
       [999, 999,   4]])

平方非掩码值:

In [97]: Am[~Am.mask]=Am.compressed()**2

In [98]: Am
Out[98]: 
masked_array(data =
 [[9 -- 9]
 [36 49 --]
 [-- 25 --]
 [-- -- 16]],
             mask =
 [[False  True False]
 [False False  True]
 [ True False  True]
 [ True  True False]],
       fill_value = 999999)

In [99]: Am.data
Out[99]: 
array([[ 9,  0,  9],
       [36, 49,  2],
       [ 2, 25,  0],
       [ 2,  1, 16]])

答案 2 :(得分:0)

如果您不需要保留数组结构,可以使用以下方法提取值:

masked = ... # your masked array
valid_points = masked[~masked.mask]

或者如果一个简单的数组就足够了:

valid_points_simple_array = valid_points.data

现在这将是1D忽略之前的任何形状,因为NumPy无法知道它是否可以保持任何形状(因为每个维度必须具有相同数量的参数)。但是如果你知道你只想保留有效的行/列,那么有一些功能,但一般来说只需要重新整形你的数组:

# Only complete rows were discarded
reshaped_valid = valid_points.reshape(masked.shape[0], valid_points.size / masked.shape[0])

# or in case for  columns
reshaped_valid = valid_points.reshape(valid_points.size / masked.shape[1], masked.shape[1])

这仅在您排除完整的行或列时才有效!如果您不需要阵列的形状,请不要使用它。

然后你可以用reshaped_valid做任何你想做的事情,如果你做了任何改变,你可以简单地再分配给原来的数组:

masked[~masked.mask] = reshaped_valid # maybe you need to use .ravel() not sure...

对不起,迟到的答案和其他答案可能更好,但我有一些互联网连接问题,但我不想丢弃它...