将numpy 3D数组转换为相对于特定索引的对称形式

将numpy 3D数组转换为相对于特定索引的对称形式,numpy,multidimensional-array,Numpy,Multidimensional Array,在矩阵矩阵n x n的情况下,我可以执行以下操作 sym = 0.5 * (mat + mat.T) 该操作给出期望的结果sym[i,j]=sym[j,i] 假设我们有一个三维数组ndarr[i,j,k],其中i,j,k0,1,…n, 那么ndarr是nxnxn。其思想是获得以下“对称”形式 nsym[i,j,k]=使用ndarr的nsym[j,i,k]。我试过这个: import numpy as np # Generate some random matrix, n = 5 ndarr

在矩阵矩阵n x n的情况下,我可以执行以下操作

sym = 0.5 * (mat + mat.T)
该操作给出期望的结果sym[i,j]=sym[j,i]

假设我们有一个三维数组ndarr[i,j,k],其中i,j,k0,1,…n, 那么ndarr是nxnxn。其思想是获得以下“对称”形式 nsym[i,j,k]=使用ndarr的nsym[j,i,k]。我试过这个:

import numpy as np

# Generate some random matrix, n = 5
ndarr = np.random.beta(0.1,1,(5,5,5))

# First attempt to symmetrize
sym1 = np.array([0.5*(ndarr[:,:,k]+ndarr[:,:,k].T) for k in range(5)])
这里的问题是sym1[i,j,k]!=sym1[j,i,k]根据需要。事实上,我得到了sym1[I,j,k]=sym1[I,k,j],在最后两个符号的交换下是对称的

# Second attempt
sym2 = 0.5*(ndarr+ndarr.T)
这里有同样的问题,关于第二个索引sym2[i,j,k]=sym2[k,j,i],sym2是对称的


为了继续,我们的目标是找到3D数组相对于第三个索引的对称形式,并保留原始ndarr[i,i,i]的对角线值

这里的问题是您没有使用正确的转置:

sym = 0.5 * (ndarr + np.transpose(ndarr, (1, 0, 2)))
默认情况下,
np.transpose
.T
属性将反转轴的顺序。在您的情况下,我们只希望翻转前两个轴:
(0,1,2)->(1,0,2)

编辑:第一次尝试失败的原因是沿第一个轴而不是最后一个轴连接每个对称矩阵。如果将
ndarr
与形状
(5,5,3)
,则更清楚:


无论如何,上面带有
np.transpose
的版本更干净、更高效。

它可以工作!我明白了,
.T
反转轴以将转置扩展到具有不同轴尺寸的阵列(这是预期的行为)。但是当我使用nxn矩阵进行切片时(第一次尝试),我不希望反转轴…听起来很清楚!我同意提议的解决方案。
In [16]: sym = np.array([0.5*(ndarr[:,:,k]+ndarr[:,:,k].T) for k in range(3)])

In [17]: sym.shape
Out[17]: (3L, 5L, 5L)