Python中的多维外积

2024-04-19 10:13:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做MNIST数据集,试图得到两个向量w_i(ith class)a_k(kth sample)的外积。你知道吗

w_i,对于i = 0...9,有784个坐标。你知道吗

对于k = 1...na_k也有784个坐标。你知道吗

我创建了两个数组w_ija_ij,其中包含所有10个类和k个样本。w_ij的形状是(10784),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)的结果。有人能给我指路吗?你知道吗


Tags: 数据samplescipy数组向量dotclassrow
1条回答
网友
1楼 · 发布于 2024-04-19 10:13:00

看起来您需要以下内容:

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+)

相关问题 更多 >