python - 删除每列(和相应行)中的异常值

标签 python numpy scipy

我的 Numpy 数组包含 10 列和大约 200 万行。

现在我需要分别分析每一列,找出离群值;并从数组中删除整个对应行。

所以我会开始分析第 0 列;在第 10,20,100 行找到异常值;并删除这些行。 接下来,我将开始分析现在修剪过的数组中的第 1 列;并应用相同的过程。

当然,我可以想到一个正常的手动过程来执行此操作(遍历每一列,找到离群值的索引,删除行,继续到其他列),但我总是发现 Numpy 包含一些快速巧妙的技巧完成这些统计任务。

如果您能详细说明该方法的运行时成本;甚至更好。

我不限于这里的 NumPy 库,如果 SciPy 有帮助,那么使用它就没有问题。

谢谢!

最佳答案

两种非常直接的方法,第二种方法稍微复杂一些:

arr = np.random.randn(2e6, 10)

def remove_outliers(arr, k):
    mu, sigma = np.mean(arr, axis=0), np.std(arr, axis=0, ddof=1)
    return arr[np.all(np.abs((arr - mu) / sigma) < k, axis=1)]

def remove_outliers_bis(arr, k):
    mask = np.ones((arr.shape[0],), dtype=np.bool)
    mu, sigma = np.mean(arr, axis=0), np.std(arr, axis=0, ddof=1)
    for j in range(arr.shape[1]):
        col = arr[:, j]
        mask[mask] &= np.abs((col[mask] - mu[j]) / sigma[j]) < k
    return arr[mask]

性能取决于你有多少异常值:

In [38]: %timeit remove_outliers(arr, 1)
1 loops, best of 3: 1.13 s per loop

In [39]: %timeit remove_outliers_bis(arr, 1)
1 loops, best of 3: 983 ms per loop

In [40]: %timeit remove_outliers(arr, 2)
1 loops, best of 3: 1.21 s per loop

In [41]: %timeit remove_outliers_bis(arr, 2)
1 loops, best of 3: 1.51 s per loop

当然还有:

In [42]: np.allclose(remove_outliers(arr, 1), remove_outliers_bis(arr, 1))
Out[42]: True

In [43]: np.allclose(remove_outliers(arr, 2), remove_outliers_bis(arr, 2))
Out[43]: True

我会说第二种方法的复杂性并不能证明其潜在的加速是合理的,但是 YMMV...

关于python - 删除每列(和相应行)中的异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447453/

相关文章:

python - 使用 DataFrame.to_dict 时 dtype 发生变化

python - Pika blocking_connection.py 随机超时连接到 RabbitMQ

python - 生成具有不同参数的python函数

python - SciPy 而不是 GNU Octave

python - 如何使用 numpy 数组创建 pydub AudioSegment?

python - 如何为 scipy 的 curve_fit 正确定义向量函数

python - 清理重新匹配对象

python - HTML View Postgresql TextArea渲染换行符或段落-python flask

python - numpy.linalg.inv 返回奇异矩阵的逆矩阵

numpy - 使用 map_fn Slow 进行元素采样