你怎么在Numpy找到IQR?

时间:2014-04-22 19:12:43

标签: python numpy

是否有烘焙的Numpy / Scipy函数来查找四分位数范围?我自己很容易做到,但mean()存在,基本上是sum/len ...

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

3 个答案:

答案 0 :(得分:85)

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

答案 1 :(得分:16)

scipy.stats中现在有iqr个功能。它从scipy 0.18.0开始提供。我最初的目的是将它添加到numpy中,但它被认为过于特定于域。

你可能最好只使用Jaime的答案,因为scipy代码只是一个过于复杂的版本。

答案 2 :(得分:1)

如果Jaime's answer适用于您的情况,请忽略此操作。但是,根据this answer,如果不是这样,要找到第一四分位数和第三四分位数的 exact 值,则应考虑执行以下操作:

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]

从引用的答案中提取的代码。