我目前正在写一些涉及我试图消除的噪音的东西,但为了做到这一点,我最初使用了掩码,但是我用掩码分析数据中断的方式。
掩蔽已经完成,我希望提取没有蒙面的数据,对此运行分析,然后用原始顺序重新构建数组。
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]])Do分析
重建阵列
array([[-, -, -],
[6, 7, 2],
[-, -, -],
[2, 1, 4]])我希望在处理1亿个数据点时能找到一种高效的方法。如有任何建议,敬请见谅。
发布于 2016-04-30 17:03:24
你可以用
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]]发布于 2016-04-30 17:06:40
蒙面数组有一个compress(ed)方法来提取未隐藏的值-作为一个一维数组(因为通常情况下掩蔽可能是不规则的)。但是,我不确定如何将新值返回原始值(或具有相同形状和掩码的数组)。(看上去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]])发布于 2016-04-30 17:23:51
如果不需要保留数组结构,只需使用以下命令即可提取值:
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...很抱歉,迟到的答案和其他的答案可能更好,但我有一些网络连接问题,但我也不想放弃它.
https://stackoverflow.com/questions/36957520
复制相似问题