Python:如何用离散(binned)值替换数组,而不是bin数?

时间:2018-03-02 15:36:46

标签: python numpy scipy

假设我有一个数组np.array([1,2,4,8,12,16,20,48])。我想用最近的分位数替换值。因此,例如,四分位数(0%,25%,50%,75%)为[1,3.5,10,15.6]。我想按四分位数值对数组值进行分区,然后将数组值替换为它们所属的四分位数值。 np.digitize的结果是[0,0,1,1,2,3,3]。我想将数组替换为[1,1,3.5,3.5,10,10,15.6,15.6]

问题是,我有巨大的阵列,所以我不能花时间使用for-style循环来一次替换一个值,例如:

data=np.array([1,2,4,8,12,16,20,48])
bins=[1,3.5,10,15.6]
newdata=[bins[_] for _ in np.digitize(data,bins[1:])]

任何人都知道一种聪明的方法吗?

编辑和解决方案:将上述内容更改为:

bins=np.array([1,3.5,10,15.6]
newdata=bins[np.digitize(data,bins[1:])]

1 个答案:

答案 0 :(得分:2)

使用以下事实:如果使用索引列表/数组索引numpy数组,则会获得这些索引处的值:

data = np.array([1,2,4,8,12,16,20,48])
bins = np.array([1,3.5,10,15.6])

dig = np.digitize(data, bins) - 1 # -1 because digitize returns the index of where it is larger than the value in bins
newdata = bins[dig]
# array([ 1. ,  1. ,  3.5,  3.5, 10. , 15.6, 15.6, 15.6])

而不是-1,您也可以将bins[1:]数字化为@jdehesa建议的in the comments

您需要确保binsnp.array,如上例所示,因为无法以这种方式编制索引列表。