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

对于w_ii = 0...9具有784个坐标。

对于a_kk = 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)的结果。有人可以指引我走正确的道路吗?

最佳答案

您似乎需要以下条件:

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/

10-12 21:13