代码之家  ›  专栏  ›  技术社区  ›  Vint

在numpy阵列中将Outler替换为NA[关闭]

  •  0
  • Vint  · 技术社区  · 7 年前

    给定这样一个numpy数组

    [[100, 110, 0.01, 110], [120, 100, 112, 100], [4000, 100, 200, 100]]
    

    如何用NA替换异常值?

    [[100, 110, NA, 110], [120, 100, 112, 100], [NA, 100, 200, 100]]
    

    至于异常值检测,我对平均值中的2个SD感到满意

    1 回复  |  直到 7 年前
        1
  •  2
  •   Luis Masuelli    7 年前

    我假设你有一个SD和mean函数编码或导入到某处。

    因此,您应该这样编写代码:

    sd = my_sd_function(my_array)
    mean = my_mean_function(my_array)
    outliers = (my_array > (mean + 2 * sd)) | (my_array < (mean - 2 * sd))
    my_array[outliers] = NA
    

    但请考虑:

    • 说真的,我不知道你说的NA是什么意思。可能 None ?
    • 我不了解数组的结构,无法生成适当的函数。也许这些功能可以满足您的需要

      def my_mean_function(arr):
          return arr.sum() / arr.size
      
      def my_sd_function(arr):
          mean = my_mean_function(arr)
          sqrerr = ((arr - mean) ** 2).sum() / arr.size
          return sqrt(sqrerr)
      

    这里您应该知道的核心部分是根据您想要的条件实际选择和更新数组元素。

    在这里,您将使用 & ~ | 而不是 and not or 关键词。这是因为numpy数组以某种方式定义了它们的实现,以使用此类操作符(和语言构造函数 实际上不是可以重载的运算符)。

    这种构造返回的对象可以像数组一样受到威胁(您可以打印 outliers 在console/ipython中,看看我在说什么)。

    第二部分是您可以传递到 my_array[...] 作为一个索引,实际上是一个索引或类似结构的列表(例如切片),并以有效的方式检索/更改这些元素(IIRC这种方法创建了一种称为 看法 到numpy数组中的基础原始数据blob中的数据)。