我正在做 MNIST 数据集,并试图获得两个向量 w_i(第 i 个类)
和 a_k(第 k 个样本)
的外积。
对于 i = 0...9
,w_i
有 784 个坐标。
对于 k = 1...n
,a_k
也有 784 个坐标。
我创建了两个数组 w_ij
和 a_ij
,其中包含所有 10 个类和 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)
的结果。有人能引导我走上正确的道路吗?
最佳答案
您似乎想要以下内容:
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+)
关于python - python中的多维外积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40095686/