好吧,所以我写了一些代码来对对称矩阵进行矢量化处理,它只吸收唯一元素并将它们转换为一维向量,同时还将对角线元素乘以root2:
def vectorize_mat(mat):
assert mat.shape[0] == mat.shape[1], 'Matrix is not square'
n = int(mat.shape[0])
vec_len = 0.5*n*(n+1)
weight_mat = (np.tri(n,k=-1)*np.sqrt(2))+np.identity(n)
mask_mat = np.tri(n).astype(bool)
vec_mat = (mat*weight_mat)[mask_mat]
return vec_mat
,这确实很好,现在我试图弄清楚如何从向量重构原始数组。我已经获得了原始矩阵尺寸,如下所示:
v = len(vec_mat)
n = isqrt(2*v)
其中isqrt()是来自以下位置的整数平方根:Integer square root in python
但是我正在为下一步做什么苦苦挣扎。我现在可以重建权重和蒙版矩阵。所以很明显,我可以向量化权重矩阵并除以向量,或者将重构的矩阵除以权重矩阵以撤消该步骤,但这是重塑和填充(来自布尔索引),我不知道如何做。也许那里有一些超级简单的答案,但我似乎看不到。
答案 0 :(得分:1)
回答您的标题问题。索引-包括布尔索引-可以用于分配。
这里是一个例子。让我们首先使用蒙版提取下部三角形。
>>> a = np.arange(25).reshape(5, 5)
>>> y, x = np.ogrid[:5, :5]
>>> lower = y>=x
>>> b = a[lower]
现在b包含下部三角形。我们可以使用相同的蒙版来重构下部三角形并对称地填充上部三角形:
>>> recon = np.empty_like(a)
>>> recon[lower] = b
>>> recon.T[lower] = b
>>> recon
array([[ 0, 5, 10, 15, 20],
[ 5, 6, 11, 16, 21],
[10, 11, 12, 17, 22],
[15, 16, 17, 18, 23],
[20, 21, 22, 23, 24]])