首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,希望从蒙面数组中提取值,然后重新构建数组。

Python,希望从蒙面数组中提取值,然后重新构建数组。
EN

Stack Overflow用户
提问于 2016-04-30 16:42:34
回答 3查看 6K关注 0票数 4

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

掩蔽已经完成,我希望提取没有蒙面的数据,对此运行分析,然后用原始顺序重新构建数组。

代码语言:javascript
复制
array([[3, 0, 3],
       [6, 7, 2],
       [2, 5, 0],
       [2, 1, 4]])

制造面具

代码语言:javascript
复制
array([[-, -, -],
       [6, 7, 2],
       [-, -, -],
       [2, 1, 4]])

提取值

代码语言:javascript
复制
array([[6, 7, 2],
       [2, 1, 4]])

Do分析

重建阵列

代码语言:javascript
复制
array([[-, -, -],
       [6, 7, 2],
       [-, -, -],
       [2, 1, 4]])

我希望在处理1亿个数据点时能找到一种高效的方法。如有任何建议,敬请见谅。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-30 17:03:24

你可以用

代码语言:javascript
复制
masked[~masked.mask] = analyzed.ravel()

将分析的值重新分配到蒙面数组。

代码语言:javascript
复制
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)

收益率

代码语言:javascript
复制
[[-- -- --]
 [60 70 20]
 [-- -- --]
 [20 10 40]]
票数 6
EN

Stack Overflow用户

发布于 2016-04-30 17:06:40

蒙面数组有一个compress(ed)方法来提取未隐藏的值-作为一个一维数组(因为通常情况下掩蔽可能是不规则的)。但是,我不确定如何将新值返回原始值(或具有相同形状和掩码的数组)。(看上去unutbu已经覆盖了这一步)

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

代码语言:javascript
复制
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]])

对非蒙面值进行平方:

代码语言:javascript
复制
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]])
票数 3
EN

Stack Overflow用户

发布于 2016-04-30 17:23:51

如果不需要保留数组结构,只需使用以下命令即可提取值:

代码语言:javascript
复制
masked = ... # your masked array
valid_points = masked[~masked.mask]

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

代码语言:javascript
复制
valid_points_simple_array = valid_points.data

现在这将是1D忽略了它以前的任何形状,因为NumPy无法知道它是否能够保持任何形状(因为每个维度都必须有相同数量的参数)。但是,如果您知道只想保留有效的行/列,则有一些函数,但一般来说,这只是重新调整数组的问题:

代码语言:javascript
复制
# Only complete rows were discarded
reshaped_valid = valid_points.reshape(masked.shape[0], valid_points.size / masked.shape[0])

代码语言:javascript
复制
# or in case for  columns
reshaped_valid = valid_points.reshape(valid_points.size / masked.shape[1], masked.shape[1])

只有当您只排除完整的行或列时,这才有效!不过,如果不需要数组的形状,就不要使用它。

然后,您可以使用reshaped_valid做任何您想做的事情,如果您做了任何更改,您可以简单地将它重新分配给原始数组:

代码语言:javascript
复制
masked[~masked.mask] = reshaped_valid # maybe you need to use .ravel() not sure...

很抱歉,迟到的答案和其他的答案可能更好,但我有一些网络连接问题,但我也不想放弃它.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36957520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档