Python 使用置换向量对矩阵重新排序,但保持矩阵的原始大小

Python 使用置换向量对矩阵重新排序,但保持矩阵的原始大小,python,arrays,numpy,permutation,reorderlist,Python,Arrays,Numpy,Permutation,Reorderlist,我有一个简单的问题,但不可能解决它。我从另一个矩阵复制了这样一个C_temp16x16矩阵(size=16) C_temp = np.zeros((size, size)) C_temp = np.copy(C_in) 然后,我有一个排列列表(或者numpy数组,我不知道它是否重要): print('index\u reorder=',

我有一个简单的问题,但不可能解决它。我从另一个矩阵复制了这样一个
C_temp
16x16矩阵(
size=16

C_temp = np.zeros((size, size))                                                                                
C_temp = np.copy(C_in)
然后,我有一个排列列表(或者numpy数组,我不知道它是否重要):

print('index\u reorder=',index\u reorder)
给出:

index_reorder = ', array([2, 4, 0, 5, 1, 3, 7, 8]))
我想沿着
x轴
y轴
进行排序

      C_temp = np.copy(C_in)
      C_temp = C_temp[:, index_reorder]
      C_temp = C_temp[index_reorder, :]
      C_new = np.copy(C_temp)
但不幸的是,新矩阵
C_new
的大小减少到了8x8

这不是我想要得到的:我想为
C_new
matrix
(16x16)
保持相同的大小,即在进行置换的同时保持置换矩阵的整个大小
C_temp

如何执行此全局置换

我相信这就是所谓的“原地置换”,不是吗

更新1:以下是矩阵16x16中的
C_示例

C_in = ', array([[ 5.39607129e+06,  1.79979372e+06, -2.46370980e+06,
        -1.12590397e+06,  2.54997996e+03, -3.48237530e+02,
         1.77139942e+05,  2.10555125e+04, -2.24912032e+05,
        -9.79292472e+01, -1.63415352e+05, -8.65388775e+01,
        -8.10556705e+04, -6.40511456e+01,  1.31499502e+04,
        -4.80973452e+01],
       [ 1.79979372e+06,  1.85207497e+07, -5.97280544e+06,
        -4.86527342e+05, -9.46833729e+05, -2.10321296e+05,
        -7.71198259e+05, -8.88750203e+04, -1.66150873e+06,
        -3.20782728e+02, -1.45257426e+06, -2.86060423e+02,
        -1.10641471e+06, -2.17539743e+02, -9.34181143e+05,
        -1.77667406e+02],
       [-2.46370980e+06, -5.97280544e+06,  3.36326384e+06,
         5.88733451e+05,  3.35606646e+05,  8.96417015e+04,
         1.12240864e+05,  1.35483472e+04,  6.10023925e+05,
         1.26679014e+02,  5.65166386e+05,  1.21455772e+02,
         4.43234727e+05,  9.80424886e+01,  3.68206009e+05,
         8.44106515e+01],
       [-1.12590397e+06, -4.86527342e+05,  5.88733451e+05,
         3.34731505e+05, -3.26665859e+04, -7.14038524e+03,
        -7.25370986e+04, -8.44842826e+03,  4.40874561e+04,
         2.82933253e+01,  2.77238713e+04,  2.47986977e+01,
         7.27381187e+03,  1.80784440e+01, -1.87787106e+04,
         1.31142301e+01],
       [ 2.54997996e+03, -9.46833729e+05,  3.35606646e+05,
        -3.26665859e+04,  7.90884228e+04,  1.92364617e+04,
         5.66130910e+04,  6.70772964e+03,  1.07063410e+05,
         1.46143888e+01,  9.53013920e+04,  1.33963997e+01,
         7.42574771e+04,  1.04791841e+01,  6.58013341e+04,
         8.95530786e+00],
       [-3.48237530e+02, -2.10321296e+05,  8.96417015e+04,
        -7.14038524e+03,  1.92364617e+04,  4.99000202e+03,
         1.10082611e+04,  1.34941127e+03,  2.41927165e+04,
         3.26733542e+00,  2.31011986e+04,  3.22432044e+00,
         1.88491639e+04,  2.65297382e+00,  1.72802490e+04,
         2.36016813e+00],
       [ 1.77139942e+05, -7.71198259e+05,  1.12240864e+05,
        -7.25370986e+04,  5.66130910e+04,  1.10082611e+04,
         9.36434428e+04,  1.07348807e+04,  6.09534507e+04,
         3.44072173e+00,  5.90764148e+04,  4.26292063e+00,
         5.10904441e+04,  4.37089791e+00,  5.24285786e+04,
         5.06825219e+00],
       [ 2.10555125e+04, -8.88750203e+04,  1.35483472e+04,
        -8.44842826e+03,  6.70772964e+03,  1.34941127e+03,
         1.07348807e+04,  1.48215248e+03,  2.49002654e+03,
         1.40557890e-01,  5.84713359e+03,  4.21925848e-01,
         7.21719030e+03,  6.17446227e-01,  9.39064037e+03,
         9.07789891e-01],
       [-2.24912032e+05, -1.66150873e+06,  6.10023925e+05,
         4.40874561e+04,  1.07063410e+05,  2.41927165e+04,
         6.09534507e+04,  2.49002654e+03,  5.91760033e+05,
         9.77850970e+01,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00],
       [-9.79292472e+01, -3.20782728e+02,  1.26679014e+02,
         2.82933253e+01,  1.46143888e+01,  3.26733542e+00,
         3.44072173e+00,  1.40557890e-01,  9.77850970e+01,
         2.42137019e-02,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00],
       [-1.63415352e+05, -1.45257426e+06,  5.65166386e+05,
         2.77238713e+04,  9.53013920e+04,  2.31011986e+04,
         5.90764148e+04,  5.84713359e+03,  0.00000000e+00,
         0.00000000e+00,  4.84422452e+05,  8.24104281e+01,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00],
       [-8.65388775e+01, -2.86060423e+02,  1.21455772e+02,
         2.47986977e+01,  1.33963997e+01,  3.22432044e+00,
         4.26292063e+00,  4.21925848e-01,  0.00000000e+00,
         0.00000000e+00,  8.24104281e+01,  2.11226210e-02,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00],
       [-8.10556705e+04, -1.10641471e+06,  4.43234727e+05,
         7.27381187e+03,  7.42574771e+04,  1.88491639e+04,
         5.10904441e+04,  7.21719030e+03,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         3.50093152e+05,  6.00111232e+01,  0.00000000e+00,
         0.00000000e+00],
       [-6.40511456e+01, -2.17539743e+02,  9.80424886e+01,
         1.80784440e+01,  1.04791841e+01,  2.65297382e+00,
         4.37089791e+00,  6.17446227e-01,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         6.00111232e+01,  1.57248915e-02,  0.00000000e+00,
         0.00000000e+00],
       [ 1.31499502e+04, -9.34181143e+05,  3.68206009e+05,
        -1.87787106e+04,  6.58013341e+04,  1.72802490e+04,
         5.24285786e+04,  9.39064037e+03,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  2.83150690e+05,
         4.74239664e+01],
       [-4.80973452e+01, -1.77667406e+02,  8.44106515e+01,
         1.31142301e+01,  8.95530786e+00,  2.36016813e+00,
         5.06825219e+00,  9.07789891e-01,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  4.74239664e+01,
         1.26116519e-02]]))
以及输出
C_new
矩阵:

C_new = ', array([[ 3.36326384e+06,  3.35606646e+05, -2.46370980e+06,
         8.96417015e+04, -5.97280544e+06,  5.88733451e+05,
         1.35483472e+04,  6.10023925e+05],
       [ 3.35606646e+05,  7.90884228e+04,  2.54997996e+03,
         1.92364617e+04, -9.46833729e+05, -3.26665859e+04,
         6.70772964e+03,  1.07063410e+05],
       [-2.46370980e+06,  2.54997996e+03,  5.39607129e+06,
        -3.48237530e+02,  1.79979372e+06, -1.12590397e+06,
         2.10555125e+04, -2.24912032e+05],
       [ 8.96417015e+04,  1.92364617e+04, -3.48237530e+02,
         4.99000202e+03, -2.10321296e+05, -7.14038524e+03,
         1.34941127e+03,  2.41927165e+04],
       [-5.97280544e+06, -9.46833729e+05,  1.79979372e+06,
        -2.10321296e+05,  1.85207497e+07, -4.86527342e+05,
        -8.88750203e+04, -1.66150873e+06],
       [ 5.88733451e+05, -3.26665859e+04, -1.12590397e+06,
        -7.14038524e+03, -4.86527342e+05,  3.34731505e+05,
        -8.44842826e+03,  4.40874561e+04],
       [ 1.35483472e+04,  6.70772964e+03,  2.10555125e+04,
         1.34941127e+03, -8.88750203e+04, -8.44842826e+03,
         1.48215248e+03,  2.49002654e+03],
       [ 6.10023925e+05,  1.07063410e+05, -2.24912032e+05,
         2.41927165e+04, -1.66150873e+06,  4.40874561e+04,
         2.49002654e+03,  5.91760033e+05]]))

我只想交换行/列(即看起来像排列?)作为行/列向量的函数。

正如您自己所发现的,问题是,
索引\u重新排序
只包含重新排序的元素

解决方案是,将其扩展到所有元素的完全排列。如果元素应该保持在原来的位置,只需将它们的索引写在原来的位置就可以了

例如:

应转变为:

full_reorder = [2, 4, 0, 5, 1, 3, 7, 8, 6, 9, 10, 11, 12, 13, 14, 15]
注意,9->9,10->10,11->11。。。。这样,它们就不会移动,也不会丢失。还有其他可以考虑的
full_-reorders
,它们的选择只取决于您的偏好。第一,你可能更喜欢的是
[2,4,0,5,1,3,6,7,8,9,10,11,12,13,14,15]
。这里是6->6,原始排列围绕它展开

第一个示例中给出的已更改的重新排序可以通过以下方式实现:

all_indices = np.array(range(16))
other_indices = np.setdiff1d(all_indices, index_reorder)
full_reorder = np.concatenate([index_reorder, other_indices])
然后继续您所做的操作:

C_temp = np.copy(C_in)
C_temp = C_temp[:, full_reorder]
C_temp = C_temp[full_reorder, :]

如果另一个元素被设置为它的原始位置,但是没有为它定义新的位置,那么你希望元素在哪里呢?例如:如果重新排序列表[3,2],我仍然不完全确定结果会是什么。你能看一下这个问题下的评论吗?我明天会看一看。我仍然需要知道你到底希望其他列/行发生什么。例如第6列/第6行现在(部分)被其他元素占据,但在当前排列中没有为其定义新的位置。在您的示例中,您有一个n-first元素的排列。保证永远都是这样吗?如果没有,您希望在本例中的结果是什么样的,例如,
index\u reorder==[4,7,2]
对不起,我没有很好地解释我的第一个问题,因此我已将其重新格式化,以便尽可能明确。如果你不明白,请不要犹豫,给我一个评论。如果你看不到解决方案,那么我将开始悬赏。你能在
中添加
C_的样本吗?或者它是什么形状?我还不完全清楚,你希望结果是什么样子。在当前示例中,未定义排列的元素应放置在何处?原始位置并不总是可能的,因为您的“排列”中缺少例如6,因此采用其原始位置。你能为一个较小的案例提供一个完整的例子吗?也许您希望以下内容是这样的:
C_in=[[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]
index_reorder=[0,2]
您正在使用一个索引数组进行索引,该数组的行和列的长度均为8,因此o/p为8x8。怎么了?您想让输出中的
C_中的非索引项保持不变吗?
C_temp = np.copy(C_in)
C_temp = C_temp[:, full_reorder]
C_temp = C_temp[full_reorder, :]