You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并NumPy数组模拟绝对值函数,处理正负分箱数据?

分箱数据绝对值合并:代码修复与优化

原代码错误说明

你的代码核心问题是判断条件逻辑错误:你误将分箱频率的绝对值作为匹配依据,而正确的匹配应该基于分箱中点的绝对值。此外,循环内的数组赋值本身是有效的,但因条件错误导致累加逻辑未触发。

修复后的原逻辑代码

import numpy as np

bin_midpoints = np.array([-3, -2, -1, 0, 1, 2])
bin_counts = np.array([30, 20, 10, 100, 1, 4])

zero_index = np.where(bin_midpoints == 0)[0][0]
# 翻转左侧负值部分,得到从-1到-3的顺序,对应绝对值1、2、3
left_mid = np.flip(bin_midpoints[0:zero_index])
left_freq = np.flip(bin_counts[0:zero_index])        
right_mid = bin_midpoints[zero_index:]
right_freq = bin_counts[zero_index:].copy()  # 改用copy避免原数组被意外修改

for i in range(len(left_freq)):
    current_abs_mid = abs(left_mid[i])
    try:
        # 匹配右侧对应绝对值的分箱中点
        if current_abs_mid == right_mid[i+1]:
            right_freq[i+1] += left_freq[i]
        else:
            # 若右侧无对应分箱,追加新的分箱
            right_freq = np.append(right_freq, left_freq[i])
            right_mid = np.append(right_mid, current_abs_mid)
    except IndexError:
        # 当左侧分箱数量多于右侧正值分箱时,追加剩余项
        right_freq = np.append(right_freq, left_freq[i])
        right_mid = np.append(right_mid, current_abs_mid)

# 最终结果
bin_midpoints = right_mid
bin_counts = right_freq

print(bin_midpoints)  # 输出:[0 1 2 3]
print(bin_counts)     # 输出:[100  11  24  30]

更高效的优化实现

上述循环逻辑在分箱数量较多时效率较低,推荐使用基于绝对值分组求和的方法,利用numpy的向量化操作或字典统计:

方法1:numpy向量化实现

import numpy as np

bin_midpoints = np.array([-3, -2, -1, 0, 1, 2])
bin_counts = np.array([30, 20, 10, 100, 1, 4])

# 计算所有分箱中点的绝对值
abs_midpoints = np.abs(bin_midpoints)
# 获取唯一的绝对值中点,并按升序排序
unique_midpoints, indices = np.unique(abs_midpoints, return_inverse=True)
# 按分组求和计数
merged_counts = np.bincount(indices, weights=bin_counts)

# 最终结果
bin_midpoints = unique_midpoints
bin_counts = merged_counts.astype(int)

print(bin_midpoints)  # 输出:[0 1 2 3]
print(bin_counts)     # 输出:[100  11  24  30]

方法2:字典统计实现(更直观)

import numpy as np

bin_midpoints = np.array([-3, -2, -1, 0, 1, 2])
bin_counts = np.array([30, 20, 10, 100, 1, 4])

count_dict = {}
for mid, cnt in zip(bin_midpoints, bin_counts):
    abs_mid = abs(mid)
    if abs_mid in count_dict:
        count_dict[abs_mid] += cnt
    else:
        count_dict[abs_mid] = cnt

# 按中点升序排序
sorted_items = sorted(count_dict.items())
bin_midpoints = np.array([item[0] for item in sorted_items])
bin_counts = np.array([item[1] for item in sorted_items])

print(bin_midpoints)  # 输出:[0 1 2 3]
print(bin_counts)     # 输出:[100  11  24  30]

内容的提问来源于stack exchange,提问作者Ellie Biessek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:25:50