【问题标题】:Get non-masked values in Numpys Masked arrays在 Numpy Masked 数组中获取非掩码值
【发布时间】:2017-06-21 23:31:45
【问题描述】:

我正在尝试从 netCDF4 文件中提取数据。这些包含“MaskedArrays”,它们是 Numpy 库的一部分。

我的数据包含:latitudelongitudedayvalues(分开在不同的文件中)。 此外还有一个掩码,它显示哪些纬度/经度由于各种原因(没有测量或其他原因)无效。

我的数据看起来像这样(屏蔽数据):

masked_array(
    data =
     [[[-- -- -- ..., -- -- --]
        ..., 
       [-- -- -- ..., -- -- --]]],
    mask =
     [[[ True  True  True ...,  True  True  True]
        ...,
       [ True  True  True ...,  True  True  True]]],
    fill_value = 32767)

我正在寻找一种 numpy 方法(或类似方法),它只能提取这些未被屏蔽的值。理想情况下,只需从数据集中删除所有无效条目。 我找到了.compressed,但它返回了一个一维数组。从第 3 维来看,这是一个相当大的信息丢失,因为我不知道这些值在哪里。

另外我试过nonzero = the_array['one of the values'][0].nonzero()。 这给了我一个带有纬度/经度值的双数组,但在那之后我仍然必须访问这些 - 这很慢。不幸的是,在知道如何访问所有这些日期之后,我需要在 30*6 个文件上执行此操作,每个文件有 ~1500×700×365 个数据点:D。

all_days = [(x, rhstmax['stuff'][x][24][1288]) for x in range(366)]
# represents just for lat:24,lon:1288 all days. First 20:
all_days[:20] =
    [(0, 15.799999),
     (1, 16.199999),
     (2, 17.4),
     (3, 13.2),
     (4, 10.8),
     (5, 11.3),
     (6, 15.299999),
     (7, 16.299999),
     (8, 14.099999),
     (9, 10.8),
     (10, 9.5),
     (11, 9.0999994),
     (12, 11.9),
     (13, 9.1999998),
     (14, 31.0),
     (15, 49.0),
     (16, 8.6999998),
     (17, 10.0),
     (18, 44.099998),
     (19, 30.699999)]
# ... takes forever :(

【问题讨论】:

  • 理想情况下,删除所有无效条目后输出的结构是什么?您是否在Accessing only the valid entries 上查看过此概述?
  • compressed 返回 1d,因为每行或每列的数值不一致。 fill 是另一种“删除”屏蔽值的方式。

标签: python performance numpy data-science masked-array


【解决方案1】:

要在 Python 中获取非屏蔽数据,您可以使用 .mask 工具

假设您有以下数据集:

data = [[0.0 1.0 -- --]
       [2.0 3.0 -- --]]

您可以通过data.mask 命令获取所有False 的索引,同时获取非屏蔽数据。

data = data[data.mask == False]

请注意,这将为您提供所有输入的一维数组

data -> [0.0 1.0 2.0 3.0]

【讨论】:

    【解决方案2】:

    如果要删除包含任何/所有屏蔽数据的行:

    data = data[~data.mask.any(axis=1)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      相关资源
      最近更新 更多