【问题标题】:how to change outliers using numpy and scipy如何使用 numpy 和 scipy 更改异常值
【发布时间】:2021-06-03 15:56:57
【问题描述】:

我正在尝试使用 numpy(不使用 pandas)删除异常值。 我创建了一个如下所示的数组:

[[-9.00681170e-01  1.01900435e+00 -1.34022653e+00 -1.31544430e+00]
[-1.14301691e+00 -1.31979479e-01 -1.34022653e+00 -1.31544430e+00]
[-1.38535265e+00  3.28414053e-01 -1.39706395e+00 -1.31544430e+00]
[-1.50652052e+00  9.82172869e-02 -1.28338910e+00 -1.31544430e+00]
[-1.02184904e+00  1.24920112e+00 -1.34022653e+00 -1.31544430e+00]
[-5.37177559e-01  1.93979142e+00 -1.16971425e+00 -1.05217993e+00]
[-1.50652052e+00  7.88807586e-01 -1.34022653e+00 -1.18381211e+00]
[-1.02184904e+00  7.88807586e-01 -1.28338910e+00 -1.31544430e+00]]

我想创建一个函数来检查该数组,如果它找到任何数字: x>=3 它将用 2.9 替换它 如果它找到一个 x

def ignoreOutlieres(array):
for i in array:
  for x in i:
      x = float(format(x,".2f"))
      if x >= 3:
          x = 2.99
      elif x <= -3:
          x = -2.99
return array

但我得到了这种类型的错误:

TypeError: 'float' 对象不能被解释为整数

然后我尝试使用numpt和z测试:

def ignoreOutlieres(num_array):
for i in num_array:
    i = np.all(stats.zscore(i)>=3, axis = 2.9)
    return num_array

但我认为我并没有真正理解它背后的想法,而且我没有正确使用它。 生病apreaciate任何形式的帮助或指导。 我最终想要得到的输出是这样的:

[[-0.90068117,  1.01900435, -1.34022653, -1.3154443 ],
                [-1.14301691, -0.13197948, -1.34022653, -1.3154443 ],
                [-1.38535265,  0.32841405, -1.39706395, -1.3154443 ],
                [-1.50652052,  0.09821729, -1.2833891 , -1.3154443 ],
                [-1.02184904,  1.24920112, -1.34022653, -1.3154443 ],
                [-0.53717756,  1.93979142, -1.16971425, -1.05217993],
                [-1.50652052,  0.78880759, -1.34022653, -1.18381211],
                [-1.02184904,  0.78880759, -1.2833891 , -1.3154443 ],
                [-1.74885626, -0.36217625, -1.34022653, -1.3154443 ],
                [-1.14301691,  0.09821729, -1.2833891 , -1.44707648],
                [-0.53717756,  1.47939788, -1.2833891 , -1.3154443 ],
                [-1.26418478,  0.78880759, -1.22655167, -1.3154443 ],
                [-1.26418478, -0.13197948, -1.34022653, -1.44707648],
                [-1.87002413, -0.13197948, -1.51073881, -1.44707648],
                [-0.05250608,  2.16998818, -1.45390138, -1.3154443 ],
                [-0.17367395, 2.9       , -1.2833891 , -1.05217993],
                [-0.53717756,  1.93979142, -1.39706395, -1.05217993],
                [-0.90068117,  1.01900435, -1.34022653, -1.18381211],
                [-0.17367395,  1.70959465, -1.16971425, -1.18381211],
                [-0.90068117,  1.70959465, -1.2833891 , -1.18381211]])

【问题讨论】:

    标签: python-3.x numpy scipy


    【解决方案1】:

    在使用 numpy 时不应使用循环。你需要np.where,它是 numpy 的组合等价物forif

    patched = np.where(array <= -3, -2.99, 
                       np.where(array >= 3, 2.99, array))
    

    【讨论】:

    • 但是我在哪里定义a?我不想通过写来定义它:for a in array:
    • array 是你的数组。
    【解决方案2】:

    您可以使用 numpy 的索引来更改这些值。 numpy_array &gt;= 3 返回一个布尔数组,因此 numpy_array[numpy_array &gt;= 3] = 2.99numpy_array &gt;= 3 计算结果为 True 的每个位置替换为 2.99

    def change_outliers(numpy_array):
        numpy_array[numpy_array >= 3] = 2.99
        numpy_array[numpy_array <= -3] = -2.99
        return numpy_array
    

    【讨论】:

    • 只是为了理解,如果它找不到任何 >= 3 的数字,它会返回 false 吗?
    • @ranbar 是的。如果数组是[1 1 2 2],则返回[False False False False],因此不会有任何值会被更改
    猜你喜欢
    • 2016-05-05
    • 2023-03-24
    • 1970-01-01
    • 2020-06-04
    • 2012-06-22
    • 2021-11-22
    • 2021-12-21
    • 2015-04-16
    相关资源
    最近更新 更多