猿问

如何将矩阵的条目标记为其索引但仍保留其原始数值?

我有一个充满数值的matrix_1,我想做的是将其转换为matrix_2,其中的值(对matrix_1 排序),然后用matrix_1 中的原始索引替换矩阵2 中的这些排序值。


我不想使用任何循环,因为矩阵相当大。


for example : matrix_1=[[2,3,4,1],[6,5,9,7]]


I want to end up with matrix_2=[[(1,4),(1,1),(1,2),(1,3)],

                                 [(2,2),(2,1),(2,4),(2,3)]]

我已经尝试在原始矩阵上使用 np.ndenumerate 但它返回 array([numpy.ndenumerate object at 0x1a1a9fce90], dtype=object)


我现在也尝试过 np.argsort() 但它似乎不起作用,可能是因为我所有的条目都是浮点数......


凤凰求蛊
浏览 127回答 3
3回答

长风秋雁

argsort应用于展平阵列:In [110]: np.argsort(arr1.ravel())                                              Out[110]: array([3, 0, 1, 2, 5, 4, 7, 6])将其转换为 2d 索引:In [111]: np.unravel_index(_,(2,4))                                             Out[111]: (array([0, 0, 0, 0, 1, 1, 1, 1]), array([3, 0, 1, 2, 1, 0, 3, 2]))将数组合并为一个,并重塑:In [112]: np.transpose(_)                                                       Out[112]: array([[0, 3],       [0, 0],       [0, 1],       [0, 2],       [1, 1],       [1, 0],       [1, 3],       [1, 2]])In [113]: _+1           # tweak values to match yoursOut[113]: array([[1, 4],       [1, 1],       [1, 2],       [1, 3],       [2, 2],       [2, 1],       [2, 4],       [2, 3]])In [114]: _.reshape(2,4,2)                                                      Out[114]: array([[[1, 4],        [1, 1],        [1, 2],        [1, 3]],       [[2, 2],        [2, 1],        [2, 4],        [2, 3]]])

慕码人8056858

使用 np.argsort 应该可以解决问题:matrix_1=np.array([[2,3,4,1],[6,5,9,7]])matrix_1array([[2, 3, 4, 1],       [6, 5, 9, 7]])x = np.argsort(matrix_1,axis=1)array([[3, 0, 1, 2],       [1, 0, 3, 2]], dtype=int64)由浮点数组成的矩阵不应该造成问题。然后,您可以将列表创建为:[[(i+1,v+1)   for v in enumerate(y)] for i, y in enumerate(x.tolist())][[(1, 4), (1, 1), (1, 2), (1, 3)], [(2, 2), (2, 1), (2, 4), (2, 3)]]

慕雪6442864

您必须来自 R 或其他开始索引的语言1。在 Python 中,索引从 开始0,因此您必须显式添加+ 1索引以使其从 1 开始。使用argsort然后reshapem1 = matrix_1.argsort(1) + 1i = (np.repeat(np.arange(m1.shape[0]), m1.shape[1]) + 1).reshape(m1.shape)np.concatenate([m1[:, None],i[:, None]], axis=1).swapaxes(2,1)哪个输出array([[[4, 1],        [1, 1],        [2, 1],        [3, 1]],       [[2, 2],        [1, 2],        [4, 2],        [3, 2]]])
随时随地看视频慕课网APP

相关分类

Python
我要回答