我正在写一些涉及很多噪音的东西,我试图删除,但为了做到这一点,我最初使用了掩码,但我使用掩码分析数据的方式。
完成屏蔽,我想提取未屏蔽的数据,对此进行分析,然后用原始顺序重建数组。
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亿个数据点。任何建议都表示赞赏。
答案 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...
对不起,迟到的答案和其他答案可能更好,但我有一些互联网连接问题,但我不想丢弃它...