gpt4 book ai didi

python - 在 Python 中使用 numpy/scipy 进行分箱的矢量化方法

转载 作者:太空狗 更新时间:2023-10-30 01:17:36 25 4
gpt4 key购买 nike

我使用 np.digitize 将 Python 中的二维数组(x 乘以 y)合并到其 x 值的容器中(在“bins”中给出):

elements_to_bins = digitize(vals, bins)

其中“vals”是一个二维数组,即:

 vals = array([[1, v1], [2, v2], ...]). 

elements_to_bins 只是说明每个元素属于哪个 bin。然后我想做的是得到一个列表,其长度是“bins”中的 bin 数,每个元素返回落入该 bin 的“vals”的 y 维度。我现在这样做:

points_by_bins = []
for curr_bin in range(min(elements_to_bins), max(elements_to_bins) + 1):
curr_indx = where(elements_to_bins == curr_bin)[0]
curr_bin_vals = vals[:, curr_indx]
points_by_bins.append(curr_bin_vals)

有没有更优雅/更简单的方法来做到这一点?我所需要的只是落入每个 bin 的 y 值列表的列表。

谢谢。

最佳答案

如果我正确理解你的问题:

vals = array([[1, 10], [1, 11], [2, 20], [2, 21], [2, 22]])  # Example

(x, y) = vals.T # Shortcut
bin_limits = range(min(x)+1, max(x)+2) # Other limits could be chosen
points_by_bin = [ [] for _ in bin_limits ] # Final result
for (bin_num, y_value) in zip(searchsorted(bin_limits, x, "right"), y): # digitize() finds the correct bin number
points_by_bin[bin_num].append(y_value)

print points_by_bin # [[10, 11], [20, 21, 22]]

Numpy 的快速数组操作 searchsorted() 用于最大效率。然后一个一个地添加值(因为最终结果不是矩形数组,Numpy 对此无能为力)。此解决方案应该比循环中的多个 where() 调用更快,后者会强制 Numpy 多次重新读取相同数组。

关于python - 在 Python 中使用 numpy/scipy 进行分箱的矢量化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2754905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com