我正在做MNIST数据集并尝试获取我的两个向量w_i(ith class)
和a_k(kth sample)
的外部产品。
w_i
,i = 0...9
,有784个坐标。
a_k
,k = 1...n
,也有784个坐标。
我创建了两个数组w_ij
和a_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)
的结果。有人能指引我走正确的道路吗?
答案 0 :(得分:3)
看起来你想要以下内容:
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+)