【问题标题】:Creating a masked array in Python with multiple given values在 Python 中创建具有多个给定值的掩码数组
【发布时间】:2012-06-21 20:27:51
【问题描述】:

我正在将大量数据的几列(通过 numpy.genfromtxt)与同样大小的时间列作图。丢失的数据通常被称为 nan、-999、-9999 等。但是我不知道如何从数组中删除多个值。这是我目前拥有的:

for cur_col in range(start_col, total_col):
    # Generate what is to be graphed by removing nan values
    data_mask = (file_data[:, cur_col] != nan_values)
    y_data = file_data[:, cur_col][data_mask]
    x_data = file_data[:, time_col][data_mask]

之后,我使用 matplotlib 为每一列创建适当的数字。如果 nan_values 是单个整数,这可以正常工作,但我希望使用列表。

编辑:这是一个工作示例。

import numpy as np

file_data = np.arange(12.0).reshape((4,3))
file_data[1,1] = np.nan
file_data[2,2] = -999
nan_values = -999

for cur_col in range(1,3):
    # Generate what is to be graphed by removing nan values
    data_mask = (file_data[:, cur_col] != nan_values)
    y_data = file_data[:, cur_col][data_mask]
    x_data = file_data[:, 0][data_mask]
    print 'y: ' + str(y_data)
    print 'x: ' + str(x_data)
print file_data

>>> y: [  1.  nan   7.  10.]
    x: [ 0.  3.  6.  9.]
    y: [  2.   5.  11.]
    x: [ 0.  3.  9.]
    [[   0.    1.    2.]
    [   3.   nan    5.]
    [   6.    7. -999.]
    [   9.   10.   11.]]

如果 nan_values = ['nan', -999] 这是我想要完成的,这将不起作用。

【问题讨论】:

  • 请发布示例数组(列表)。
  • @AshwiniChaudhary 我已经编辑了问题以包含一个工作示例。

标签: python arrays numpy mask


【解决方案1】:

我建议像这样使用masked arrays

>>> a = np.arange(12.0).reshape((4,3))
>>> a[1,1] = np.nan
>>> a[2,2] = -999
>>> a
array([[   0.,    1.,    2.],
       [   3.,   nan,    5.],
       [   6.,    7., -999.],
       [   9.,   10.,   11.]])
>>> m = np.ma.array(a,mask=(~np.isfinite(a) | (a == -999)))
>>> m
masked_array(data =
 [[0.0 1.0 2.0]
 [3.0 -- 5.0]
 [6.0 7.0 --]
 [9.0 10.0 11.0]],
             mask =
 [[False False False]
 [False  True False]
 [False False  True]
 [False False False]],
       fill_value = 1e+20)

【讨论】:

  • 虽然结果是我需要的,但它不使用可以大大简化我正在做的事情的列表。有没有办法用 ma.array 中的 mask= 列表替换 or 语句?
  • mask=np.logical_or.reduce([a == value for value in [-99,-999,-9999]])。请注意np.nan != np.nan,因此您必须明确地将其添加到掩码中。
  • 非常好,正是我需要的。谢谢。
  • @user545424 对那个 sn-p 非常小心。如果 a 很大并且您有一个要检查的值列表,那么您的内存需求将会爆炸。 [编辑:我说的是 sn-p:mask=np.logical_or.reduce([a == value for value in [-99,-999,-9999]]) ]
  • 这对浮点数是否健壮? scipy 文档说,在基于浮点值进行屏蔽时,建议使用masked_values
【解决方案2】:

我会尝试类似(伪代码):

nan_values = [...]

for cur_col in range(start_col, total_col):
    # Generate what is to be graphed by removing nan values
    y_data = [file_data[i,cur_col] for i in range(len(file_data)) if not(file_data[i,cur_col] in nan_values)]
    x_data = [file_data[i,time_col] for i in range(len(file_data)) if not(file_data[i,cur_col] in nan_values)]

【讨论】:

  • 我无法将这个示例应用到我最近添加的工作示例中。我收到'int'类型的参数不可迭代'
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多