我想通过其中一列中的中间值选择一行数组。
我的方法不能按照我期望的方式工作,它可能与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()函数返回一个不同的数字表示,从而导致选择不匹配。
我发现这种行为很奇怪,因为根据定义,数组的中值应该包含在数组中。任何帮助/澄清将不胜感激!
答案 0 :(得分:3)
首先,值的数量甚至是[1, 2, 3, 4]
。中位数为(2+3)/2
而不是2
或3
。如果您将100
更改为101
,则可以正常使用。所以你的第二种方法更符合你的目的。
但是,最佳解决方案似乎使用argsort
作为
some_array[some_array.argsort()[len(some_array)/2]]
此外,在比较两个==
值时,请勿使用float
。请改用np.isclose
。