【问题标题】:How to vectorize with mismatched dimensionality如何使用不匹配的维度进行矢量化
【发布时间】: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 <= pr 变成nxmxp 矩阵。然后我在rB 上打电话给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 是否比使用broadcastingR[:, :, np.newaxis] * B 更有效?
  • @KoenG。在这种情况下,两者之间的性能几乎没有差异,广播可能会快一点。
  • broadcasting 的基本规则 - 根据需要显式添加尾随维度,自动添加前导维度。所有大小为 1 的维度都经过调整以匹配其他数组。

标签: python numpy vectorization matrix-multiplication


【解决方案1】:

使用np.newaxis 添加一个额外的维度,然后broadcasting 会为您处理重复。

import numpy as np
r = np.random.random((3,4))
b = np.random.random((3,4,5))
a = r[:,:,np.newaxis] * b

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2017-05-29
    • 2019-10-21
    • 2010-09-29
    • 2015-08-25
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多