Python数组组合计算出现重复结果及符号异常的原因排查
问题分析与解决方案
我来帮你拆解下这个问题的根源,以及怎么快速修复:
为什么会出现6行重复的结果?
这是NumPy的广播机制在起作用,你的维度不匹配导致了意外的数组扩展:
r1和r2都是(6,1)的二维数组,所以r1 * r2得到的sign也是(6,1)的二维数组(每个元素是对应位置的符号)。- 而
np.min(np.abs(r), axis=1) / np.max(np.abs(r), axis=1)计算出的是(6,)的一维数组——因为axis=1是按行取最小/最大值,每行2个元素处理后得到6个比值。 - 当你用
np.multiply把(6,1)和(6,)相乘时,NumPy会自动把两个数组广播成(6,6)的形状:(6,1)沿列复制6次,(6,)沿行复制6次,最终就生成了6行重复的结果。
为什么第4行符号全为负?
看r的第4行数据:[68.78926787, -2.65954113],r1的第4个元素是正数,r2的第4个元素是负数,所以r1*r2的结果为负,对应sign的第4行是[-1]。
在广播时,这个-1会被应用到第4行的所有6个元素上,导致整行符号都为负;而其他行的sign都是正数,所以整行都是正的比值结果。
修复代码
只需要让sign和比值数组的维度保持一致,就能得到每个位置对应相乘的正确结果,最后转成单行数组:
修改后的完整代码:
from itertools import combinations import numpy as np res = [ np.array([[12.99632095], [29.60571445], [-1.85595153], [68.78926787], [ 2.75185088], [ 2.75204384]]), np.array([[ 15.66458062], [ 22.16467595], [ -3.75927882], [ -2.65954113], [ 2.30128711], [197.45459974]]) ] pairs = combinations(res, 2) for pair in pairs: r = np.concatenate(pair, axis=1) r1 = pair[0] r2 = pair[1] # 把sign转成一维数组,和比值维度匹配 sign = np.sign(r1 * r2).flatten() # 计算每行的最小绝对值/最大绝对值 ratio = np.min(np.abs(r), axis=1) / np.max(np.abs(r), axis=1) # 对应元素相乘 result = sign * ratio # 转成单行二维数组 result = result.reshape(1, -1) print(result)
运行后会输出你期望的结果:
[[ 0.82966287 0.74866209 0.49369882 -0.03866215 0.83626883 0.0139376 ]]
内容的提问来源于stack exchange,提问作者Opps_0
相关产品推荐
相关产品推荐

