Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从布尔索引数组反向工程原始数组?_Python_Arrays_Numpy - Fatal编程技术网

Python 如何从布尔索引数组反向工程原始数组?

Python 如何从布尔索引数组反向工程原始数组?,python,arrays,numpy,Python,Arrays,Numpy,我写了一些对对称矩阵进行矢量化的代码,它只需要将唯一元素转换成一维向量,同时将非对角元素乘以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

我写了一些对对称矩阵进行矢量化的代码,它只需要将唯一元素转换成一维向量,同时将非对角元素乘以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()是以下各项的整数平方根:


但我正挣扎着下一步该怎么办。我现在可以重建权重矩阵和遮罩矩阵。很明显,我可以对权重矩阵进行向量化,然后除以向量,或者将重构矩阵除以权重矩阵来撤销这一步骤,但我不知道怎么做的是重塑和填充(从布尔索引)。也许有一些非常简单的答案,但我似乎看不到

来回答你的标题问题。索引(包括布尔索引)可用于赋值

这里有一个例子。让我们首先使用遮罩提取下三角形

>>> 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]])