Python 三阶矩计算-numpy

Python 三阶矩计算-numpy,python,algorithm,numpy,matrix,Python,Algorithm,Numpy,Matrix,在python中,我有一个数组X,其中有N行(示例数)和N列(特性数) 如果我想计算二阶矩矩阵C C[i,j]=E(x_i x_j) 那么我有两种可能性: 首先,执行循环: for i in range(N): for j in range(n): for k in range(n): C[j,k] = C[j,k] + X[i,j]*X[i,k]/N 对于范围(N)中的i: 对于范围(n)内的j: 对于范围(n)内的k: C[j,k]=C[j,

在python中,我有一个数组X,其中有N行(示例数)和N列(特性数)

如果我想计算二阶矩矩阵C

C[i,j]=E(x_i x_j)

那么我有两种可能性:

  • 首先,执行循环:

    for i in range(N): for j in range(n): for k in range(n): C[j,k] = C[j,k] + X[i,j]*X[i,k]/N 对于范围(N)中的i: 对于范围(n)内的j: 对于范围(n)内的k: C[j,k]=C[j,k]+X[i,j]*X[i,k]/N
  • 第二,更简单,使用numpy产品矩阵:

    import numpy np C = np.transpose(X).dot(X)/N 导入numpy np C=np.转置(X).点(X)/N 第二个版本在实践中速度非常快

如果现在我想计算三阶矩矩阵T

T[i,j,k]=E(x_i x_j x_k)

那么,循环替代方案很容易:

for i in range(N): for j in range(n): for k in range(n): for m in range(n): T[j,k,m] = T[j,k,m] + X[i,j]*X[i,k]*X[i,m]/N 对于范围(N)中的i: 对于范围(n)内的j: 对于范围(n)内的k: 对于范围内的m(n): T[j,k,m]=T[j,k,m]+X[i,j]*X[i,k]*X[i,m]/N
有没有一种使用numpy库快速计算最后一个张量的方法,比如二阶矩?

我知道它在速度方面并不完美,但为什么不使用
np.power(x,3.sum()/N
?它比点积慢,但比循环快

In [1]: import numpy as np
In [2]: x = np.random.rand(10000)
In [3]: x.dot(x.T)
Out[3]: 3373.6189738897856
In [4]: %timeit(x.dot(x.T))
The slowest run took 48.74 times longer than the fastest. This could   mean that an intermediate result is being cached.
100000 loops, best of 3: 4.39 µs per loop
In [5]: %timeit(np.power(x, 2).sum())
The slowest run took 4.14 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 140 µs per loop
In [6]: np.power(x, 2).sum()
Out[6]: 3373.6189738897865
顺便说一句,这就是我计算力矩的方法…

你可以用来解决你的二阶和三阶情况

第二顺序:

np.einsum('ij,ik->jk',X,X)/N
np.einsum('ij,ik,il->jkl',X,X,X)/N
第三顺序:

np.einsum('ij,ik->jk',X,X)/N
np.einsum('ij,ik,il->jkl',X,X,X)/N

可以看出,将其扩展到更高阶的情况会更容易/直观。

我得到一个
值错误:当将
np.einsum('ij,ik->jk',X,X)/N
应用到我的数组(图像)时,操作数的维数比爱因斯坦和中给出的下标要多。@calocedrus你的图像很可能是3D数组。所以,这行不通。请发布一个新问题。的确,谢谢你指出这一点!在这种情况下,正确的语法应该是
np.einsum('ij…,ik…->jk…',X,X)/N
和三阶矩的等效语法。