@
acone2003 新年快乐!
会,这个是我脑残……这个方法大概就是暴力循环
for f in features:
....for val in f:
........for l, r, val
这样,使用 numpy 的索引大概是这个计算量(按大小判定)的两倍,但是 numpy 的各种操作非常快。我觉得这个问题可以通过边界问题搞定,例如 NBins = [a.min(), 0.3, ...., np.inf],然后 vals 减掉一个值 V ,使所有的 vals 都小于 a.min(),即 vals-V < a.min(),然后替换完以后 a = a+V ,这个方法在数组大了以后会比循环快一些,小数组和循环没啥区别。
不过根据索引也许有个简单的方法,但是 binsize 如果非常不均匀可能需要非常小的 binsize ,你这个箱体 binsize=0.1 是刚好的,先令 NBins=np.array([0.3, ...7.6]),我觉得所以
a = np.asarray(a/binsize, dtype=np.int64)
然后生成新的 NBins:
nvals = np.diff(np.array(NBins/binsize, dtype=np.int64), prepend=0))
r = np.concatenate([ [val] * n for val, n in zip(vals, nvals)])
这里 r 会生成 2 个 3.5 ,52 个 7.8,...
然后处理边界
a[a<int(NBins[0]/0.1)] = len(r)
a[a>int(NBins[-1]/0.1)] = len(r)+1
r = np.append(r, left_bound_val)
r = np.append(r, right_bound_val)
然后 r[a] 就是结果。这样的计算量是最小的。不过需要注意两点,一是 NBins 里的值不总大于 0 ,二是很小 binsize 以及变化很急剧的 NBins 会导致一个巨长的数组 r ,也会很麻烦。不过这些可以通过线性变换你的样本和 NBins 一类的方法解决,就看具体情况了。