如何计算numpy数组每行对应的单位向量,解决广播运算报错问题?
问题原因
你遇到的广播错误是因为范数计算结果的维度和原数组不匹配:np.linalg.norm(A, axis=1)返回的是形状为(4,)的一维数组,无法直接和形状为(4,2)的二维数组执行广播运算。
正确实现方式
两种常用的可行写法:
推荐最简写法
计算范数时直接保留维度,不需要额外调整:
import numpy as np A = np.array([[50,14],[26,11],[81,9],[-11,-19]]) # 计算每行范数时保留维度,得到形状为(4,1)的列向量 row_norms = np.linalg.norm(A, axis=1, keepdims=True) # 直接执行除法即可,自动按行广播 A_unit = A / row_norms # 如需原地修改,直接写 A /= row_norms 即可
手动调整维度写法
如果已经计算得到了一维的范数数组,手动新增列维度匹配广播规则:
row_norms = np.linalg.norm(A, axis=1) # 手动将形状(4,)调整为(4,1) A_unit = A / row_norms[:, np.newaxis] # 也可写作 row_norms.reshape(-1, 1) 效果一致
补充说明
- numpy的元素级运算(包括
/、np.divide)没有axis参数,维度匹配完全依赖广播规则,不需要额外指定axis。 - 可以通过如下代码验证结果正确性,输出的每行范数应该近似为1:
print(np.linalg.norm(A_unit, axis=1)) # 输出:[1. 1. 1. 1.]
内容的提问来源于stack exchange,提问作者swiss_knight
相关产品推荐
相关产品推荐

