是否存在函数可重塑数组,实现多维度广播下的数组乘积?
更简便的多数组跨维度广播相乘方法
针对你需要将多个一维数组在不同维度上广播相乘得到高维数组的需求,有几种更简洁直观的方法,无需手动构造shape矩阵:
1. 针对少量数组(如3个):用np.newaxis(或np.expand_dims)直接扩展维度
np.newaxis是np.expand_dims的简写,能直接指定数组要扩展的维度位置,代码可读性更强:
import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) c = np.array([7,8,9]) # 每个数组对应一个维度,其余维度用None扩展为1 result = a[None, None, :] * b[None, :, None] * c[:, None, None]
等价于用np.expand_dims的写法:
result = np.expand_dims(a, (0,1)) * np.expand_dims(b, (0,2)) * np.expand_dims(c, (1,2))
最终结果的shape为(3,3,3),和你原来的reshape方法效果一致。
2. 通用n个数组的解法:用np.meshgrid + np.prod
如果是任意数量的一维数组(比如你例子中的6个),可以直接用np.meshgrid生成各维度的网格数组,再用np.prod完成批量相乘:
import numpy as np # 示例:6个shape为(3,)的数组 arrays = [np.array([1,2,3]) for _ in range(6)] # 生成对应各维度的网格,indexing='ij'保证每个数组对应独立维度 grids = np.meshgrid(*arrays, indexing='ij') # 对所有网格数组相乘,得到shape为(3,3,3,3,3,3)的结果 result = np.prod(grids, axis=0)
np.meshgrid(*arrays, indexing='ij')会自动为每个输入数组生成对应维度的扩展数组(每个数组仅在自身对应维度保留原长度,其余维度为1),完全符合你的广播需求。
3. 另一种通用解法:列表推导式扩展维度 + np.prod
如果你不想用meshgrid,也可以通过列表推导式手动为每个数组扩展维度,再批量相乘:
import numpy as np arrays = [np.array([1,2,3]) for _ in range(6)] n = len(arrays) # 对第i个数组,在除了第i个维度外的所有维度扩展为1 expanded_arrays = [ np.expand_dims(arr, tuple(range(i)) + tuple(range(i+1, n))) for i, arr in enumerate(arrays) ] # 批量相乘所有扩展后的数组 result = np.prod(expanded_arrays, axis=0)
这些方法都比你手动构造shape矩阵的方式更简洁,避免了手动处理维度索引的繁琐,同时减少了出错的可能。
内容的提问来源于stack exchange,提问作者Ben T
相关产品推荐
相关产品推荐

