假设我有一个数组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:])]
答案 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。
您需要确保bins
是np.array
,如上例所示,因为无法以这种方式编制索引列表。