【发布时间】:2019-10-31 17:43:08
【问题描述】:
我有一些形式的限制
A_{i,j,k} = r_{i,j}B_{i,j,k}
A 是一个nxmxp 矩阵,B 也是。r 是一个nxm 矩阵。
我想以某种方式在 Python 中尽可能高效地对其进行矢量化。现在,我通过说r_{i,j,k} = r_{i,j} for all 1 <= k <= p 将r 变成nxmxp 矩阵。然后我在r 和B 上打电话给np.multiply。这似乎效率低下。欢迎任何想法,谢谢。
def ndHadamardProduct(r, n, m, p): #r is a n x m matrix, p is an int
rnew = np.zeros(n, m, p)
B = np.zeros(n, m, p)
for i in range(n):
for j in range(m):
for k in range(p):
r[i, j, k] = r[i, j]
B[i, j, k] = random.uniform(0, 1)
return np.multiply(r, B)
【问题讨论】:
-
请发布您的代码和输出。
-
一个最小的例子会更有帮助,但我猜你想要
np.einsum('ij,ijk->ijk', r, B) -
np.einsum 是否比使用broadcasting 和
R[:, :, np.newaxis] * B更有效? -
@KoenG。在这种情况下,两者之间的性能几乎没有差异,广播可能会快一点。
-
broadcasting的基本规则 - 根据需要显式添加尾随维度,自动添加前导维度。所有大小为 1 的维度都经过调整以匹配其他数组。
标签: python numpy vectorization matrix-multiplication