python - 向量外积的泛化 : apply it to every column of a matrix

标签 python numpy matrix matrix-multiplication tensor

我有一个矩阵 A = [x1, x2, ..., xm],其中每个 xi 是大小为 [n, 1] 的列向量]。所以 A 的形状为 [n, m]。我试图找到每个列向量的协方差矩阵,以便如果结果是另一个矩阵 CC 具有形状 [n, n, m]C[:,:,i] = np.outer(xi, xi)

有人可以告诉我如何在 numpy 中执行上述操作,或者指出我应该检查的张量运算吗?

最佳答案

所以你的外部循环产生:

In [1147]: A = np.arange(12).reshape(3,4)
In [1148]: [np.outer(A[:,i],A[:,i]) for i in range(4)]
Out[1148]: 
[array([[ 0,  0,  0],
        [ 0, 16, 32],
        [ 0, 32, 64]]), array([[ 1,  5,  9],
        [ 5, 25, 45],
        [ 9, 45, 81]]), array([[  4,  12,  20],
        [ 12,  36,  60],
        [ 20,  60, 100]]), array([[  9,  21,  33],
        [ 21,  49,  77],
        [ 33,  77, 121]])]

堆叠在新的第一维度上产生:

In [1149]: np.stack(_)
Out[1149]: 
array([[[  0,   0,   0],
        [  0,  16,  32],
        [  0,  32,  64]],
    ....
        [ 21,  49,  77],
        [ 33,  77, 121]]])
In [1150]: _.shape
Out[1150]: (4, 3, 3)    # wrong order - can be transposed.

stack 让我们指定不同的轴:

In [1153]: np.stack([np.outer(A[:,i],A[:,i]) for i in range(4)],2)
Out[1153]: 
array([[[  0,   1,   4,   9],
        [  0,   5,  12,  21],
        [  0,   9,  20,  33]],

       [[  0,   5,  12,  21],
        [ 16,  25,  36,  49],
        [ 32,  45,  60,  77]],

       [[  0,   9,  20,  33],
        [ 32,  45,  60,  77],
        [ 64,  81, 100, 121]]])

np.einsum 也很好地做到了这一点:

In [1151]: np.einsum('mi,ni->mni',A,A)
Out[1151]: 
array([[[  0,   1,   4,   9],
        [  0,   5,  12,  21],
        [  0,   9,  20,  33]],

       [[  0,   5,  12,  21],
        [ 16,  25,  36,  49],
        [ 32,  45,  60,  77]],

       [[  0,   9,  20,  33],
        [ 32,  45,  60,  77],
        [ 64,  81, 100, 121]]])
In [1152]: _.shape
Out[1152]: (3, 3, 4)

广播乘法也不错

In [1156]: A[:,None,:]*A[None,:,:]
Out[1156]: 
array([[[  0,   1,   4,   9],
        [  0,   5,  12,  21],
      ...
        [ 32,  45,  60,  77],
        [ 64,  81, 100, 121]]])

关于python - 向量外积的泛化 : apply it to every column of a matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45850897/

相关文章:

python - 有没有办法在 rdflib 中迭代地将列表添加到图形中?

python - tensorflow 中的谱范数 2x2 矩阵

python - 根据列值有条件地保留重复项

python - 使用 db_manager 时,“QuerySet”对象没有属性 'login_name'

Python Scipy 优化方法 : global optimization failed

python - 这两个文件的类型有什么区别?

Python Image Shuffle Failure - 我哪里出错了?

c - 程序不会打印矩阵

r - R中的双重居中

python - python 新手从文件创建两个字典需要特定行