如何优雅地将NumPy数组多列按行除以另一一维数组?
NumPy多列按行除以一维数组的优雅实现
要实现对NumPy数组的指定多列逐行除以一个一维数组,直接运算会因广播维度不匹配报错(如a1[:,:2] / a2会提示shapes (3,2) (3,)不兼容),转置的方法可行但不够简洁,以下是几种更优雅的实现方式:
方法1:利用索引增加维度(最简洁)
通过[:, None]给一维数组a2增加一个维度,使其形状变为(3,1),这样就能和(3,2)的a1[:,:2]按照广播规则完成逐行除法:
import numpy as np a1 = np.array([[1,2,3],[4,5,6],[7,8,9]]) a2 = np.array([11,12,13]) result = a1[:,:2] / a2[:, None] print(result) # 输出: # [[0.09090909 0.18181818] # [0.33333333 0.41666667] # [0.53846154 0.61538462]]
方法2:显式扩展维度(更直观)
使用np.expand_dims明确扩展a2的维度,原理和方法1一致,适合需要清晰表达操作意图的场景:
result = a1[:,:2] / np.expand_dims(a2, axis=1)
方法3:指定运算轴(NumPy 1.25+)
如果使用NumPy 1.25及以上版本,可以直接在np.divide中指定axis=0,让一维数组沿着行轴与二维数组匹配运算,无需手动调整维度:
result = np.divide(a1[:,:2], a2, axis=0)
以上方法都能得到和转置法一致的结果,且代码更简洁易读。
内容的提问来源于stack exchange,提问作者PydPiper
相关产品推荐
相关产品推荐

