选择中值的数据

时间:2014-05-19 10:03:10

标签: python numpy selection precision analysis

我想通过其中一列中的中间值选择一行数组。

我的方法不能按照我期望的方式工作,它可能与numpy.median()函数返回的值的表示/精度有关。

以下是我发现的最小工作示例和解决方法:

import numpy as np

# Create an array with random numbers
some_array = np.random.rand(100)

# Try to select
selection = (some_array == np.median(some_array))
print len(some_array[selection]),len(some_array[~selection]) # Gives: 0, 100 -> selection fails

# Work-around
abs_dist_from_median = np.abs(some_array-np.median(some_array))
selection = (abs_dist_from_median == np.min(abs_dist_from_median))
print len(some_array[selection]),len(some_array[~selection]) # Gives: 1, 99 -> selection succeeded 

似乎np.median()函数返回一个不同的数字表示,从而导致选择不匹配。

我发现这种行为很奇怪,因为根据定义,数组的中值应该包含在数组中。任何帮助/澄清将不胜感激!

1 个答案:

答案 0 :(得分:3)

首先,值的数量甚至是[1, 2, 3, 4]。中位数为(2+3)/2而不是23。如果您将100更改为101,则可以正常使用。所以你的第二种方法更符合你的目的。

但是,最佳解决方案似乎使用argsort作为

some_array[some_array.argsort()[len(some_array)/2]]

此外,在比较两个==值时,请勿使用float。请改用np.isclose