你如何在 Numpy 中找到 IQR?

Posted

技术标签:

【中文标题】你如何在 Numpy 中找到 IQR?【英文标题】:How do you find the IQR in Numpy? 【发布时间】:2014-06-07 08:07:32 【问题描述】:

是否有内置的 Numpy/Scipy 函数来查找四分位数范围?我自己可以很容易地做到这一点,但 mean() 存在,基本上是 sum/len...

def IQR(dist):
    return np.percentile(dist, 75) - np.percentile(dist, 25)

【问题讨论】:

我不认为它有一个函数,你必须像你一样计算百分位数。 @BrenBarn。现在有... 【参考方案1】:

np.percentile 接受多个百分位参数,你最好这样做:

q75, q25 = np.percentile(x, [75 ,25])
iqr = q75 - q25

iqr = np.subtract(*np.percentile(x, [75, 25]))

比拨打两个电话percentile:

In [8]: x = np.random.rand(1e6)

In [9]: %timeit q75, q25 = np.percentile(x, [75 ,25]); iqr = q75 - q25
10 loops, best of 3: 24.2 ms per loop

In [10]: %timeit iqr = np.subtract(*np.percentile(x, [75, 25]))
10 loops, best of 3: 24.2 ms per loop

In [11]: %timeit iqr = np.percentile(x, 75) - np.percentile(x, 25)
10 loops, best of 3: 33.7 ms per loop

【讨论】:

使用 ufunc 机制,np.substract.reduce。恕我直言,比 * 魔法更清晰。 @Jaime * 运算符是什么?它在做什么? 它正在解包它之后的元组,因此该函数不是两个项目序列,而是两个单独的项目。 减去两个数字是 O(1),而找到 %iles 需要 O(n),因此解压缩这两个数字并非常明确地添加它们是非常好的。【参考方案2】:

现在scipy.stats 中有一个iqr 函数。它从 scipy 0.18.0 开始可用。我最初的意图是将它添加到 numpy,但它被认为过于特定于域。

使用 Jaime 的答案可能会更好,因为 scipy 代码只是其过于复杂的版本。

【讨论】:

为什么 IQR 对于 numpy 来说被认为是特定于域的? 因为它不是一个广泛使用的指标。请随时搜索邮件列表以获取详细信息。【参考方案3】:

如果Jaime's answer 适合您的情况,请忽略此内容。但如果不是,根据this answer,要找到第一和第三四分位数的精确值,您应该考虑执行以下操作:

samples = sorted([28, 12, 8, 27, 16, 31, 14, 13, 19, 1, 1, 22, 13])

def find_median(sorted_list):
    indices = []

    list_size = len(sorted_list)
    median = 0

    if list_size % 2 == 0:
        indices.append(int(list_size / 2) - 1)  # -1 because index starts from 0
        indices.append(int(list_size / 2))

        median = (sorted_list[indices[0]] + sorted_list[indices[1]]) / 2
        pass
    else:
        indices.append(int(list_size / 2))

        median = sorted_list[indices[0]]
        pass

    return median, indices
    pass

median, median_indices = find_median(samples)
Q1, Q1_indices = find_median(samples[:median_indices[0]])
Q2, Q2_indices = find_median(samples[median_indices[-1] + 1:])

IQR = Q3 - Q1

quartiles = [Q1, median, Q2]

代码取自参考答案。

【讨论】:

以上是关于你如何在 Numpy 中找到 IQR?的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤IQR低于特定值的矩阵的列?

在 SQL 中为分组数据计算 LQ、UQ 和 IQR

如何在 python 中找到 numpy 矩阵的长度(或尺寸、大小)? [复制]

如何在numpy中找到每行中最大的索引,行的串联?

如何在 numpy 数组中找到行索引的最大值?

如何在 14x14 numpy 矩阵中找到 10 个最高数字的索引? [复制]