python - python中的多维外积

标签 python arrays numpy multidimensional-array scipy

我正在做 MNIST 数据集,并试图获得两个向量 w_i(第 i 个类)a_k(第 k 个样本) 的外积。

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

对于 k = 1...na_k 也有 784 个坐标。

我创建了两个数组 w_ija_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/

相关文章:

python - 如何根据另一个数据框中的列填充数据框中的空值?

java - 将二维数组中每行的 null 元素移动到该行的末尾

c++ - 与 MKL 一起使用的数组类型

python - 循环遍历 pandas 数据框行以应用条件的替代方案?

python - 用另一个 numpy 数组的值逐行替换 numpy 数组

python - 以百分比表示的 Openpyxl 图表轴

python - 程序中的奇怪错误,某些对象在使用后出现 "turns off"

使用数组进行 C 编程

python - 使用numpy将数组分组为嵌套结构

Python Tkinter Text-Widget 滚动到特定行