【问题标题】:Multi-dimensional outer-product in pythonpython中的多维外积
【发布时间】:2017-02-26 23:40:06
【问题描述】:

我正在做 MNIST 数据集并试图获得我的两个向量 w_i(ith class)a_k(kth sample) 的外积。

w_i,对于 i = 0...9,有 784 个坐标。

a_k,对于k = 1...n,也有784个坐标。

我创建了两个数组 w_ija_ij,其中包含所有十个类和 k 个样本。 w_ij 的形状为 (10, 784),a_ij 的形状为 (n, 784)。

我试图得到类似的结果:

[[w_0 dot a_1, w_0 dot a_2, ... , w_0 dot a_n], # (first row)
[w_1 dot a_1, w_1 dot a_2, ..., w_1 dot a_n], # (second row)
...,
[w_9 dot a_1, ..., w_9 dot a_n]] # (nth row)

所以数组的形状应该像(10, n)。我尝试使用scipy.outer(w_ij, a_k)scipy.multiply.outer(w_ij, a_k)。但是,它使我得到了形状为(7840, 784*n) 的结果。有人可以指引我走向正确的道路吗?

【问题讨论】:

  • 注意:我被质疑是否可以在不使用任何循环的情况下获得结果。所以我尽量避免使用它。

标签: python arrays numpy multidimensional-array scipy


【解决方案1】:

您似乎想要以下内容:

res = np.einsum('pi,qi->pq', w, a)

这是索引符号中以下内容的简写:

res[p,q] = w[p,i]*a[q,i]

在这种表示法中,约定是对所有未出现在输出中的索引求和


但是,请注意ij,jk->ik 只是标准矩阵乘积,ij->ji 只是矩阵转置。所以我们可以将其简化如下

np.einsum('pi,qi->pq', w, a)   # as before
np.einsum('pi,iq->pq', w, a.T) # transpose and swapping indices cancel out
np.einsum('ij,jk->ik', w, a.T) # index names don't matter
w @ a.T                        # wait a sec, this is just matrix multiplication (python 3.5+)

【讨论】:

  • np.dot(w, a.T)?
  • 感谢您的提示!
猜你喜欢
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
相关资源
最近更新 更多