如何用Pythonic/Numpy方式实现二维数组行自乘及列元素累乘?
问题1:Pythonic/Numpy风格实现二维数组每行与自身相乘
得先明确你说的“相乘”是哪种场景,分两种情况处理最贴合Numpy的风格:
元素级逐位相乘:如果是让每行的每个元素和自身直接相乘(本质就是每行元素平方),用Numpy的广播特性一行搞定,简洁又高效:
result = arr * arr # 要是明确是求平方,用np.square(arr)可读性更强比如输入
arr = np.array([[1,2],[3,4]]),结果会是[[1,4],[9,16]],完全符合Pythonic的简洁思路。矩阵外积相乘:如果是把每行作为行向量,和自身做矩阵外积(得到一个3D数组,每个元素是原行的外积矩阵),推荐用广播代替循环,性能更优:
# 通过增加维度实现广播,避免apply_along_axis这类隐性循环 result = arr[:, :, np.newaxis] * arr[:, np.newaxis, :]比如输入
arr = np.array([[1,2],[3,4]]),结果会是一个(2,2,2)的数组,第一页是[[1,2],[2,4]],第二页是[[9,12],[12,16]],正好是每行与自身的外积结果。
问题2:Numpy内置函数实现按列累乘
当然有更合适的方案!np.prod()就是Numpy专门为这类需求设计的内置函数,比用reduce要高效且直观得多:
import numpy as np arr = np.array([[1,2,3],[1,2,3],[1,2,3]]) prod = np.prod(arr, axis=0) # 输出结果:array([1, 8, 27])
为什么这是更好的选择?
- 性能碾压:Numpy内置函数是底层C优化的向量化操作,比Python层面的
reduce循环快几个数量级,数组规模越大差距越明显。 - 可读性拉满:
np.prod(arr, axis=0)一眼就能看懂是按列计算乘积,而lambda+reduce的写法需要额外花时间理解逻辑。 - 灵活性更高:还能通过
dtype参数指定结果类型,避免整数溢出问题,比如np.prod(arr, axis=0, dtype=np.int64)。
要是需要按行累乘,只需要把axis改成1就行,非常灵活。
内容的提问来源于stack exchange,提问作者Pryderide
相关产品推荐
相关产品推荐

