如何合并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
相关产品推荐
相关产品推荐

