按单元格值枚举python矩阵

时间:2017-11-09 07:40:01

标签: python numpy matrix enumeration

给出一个矩阵:

m = np.matrix('1 2; 3 4')

我想按矩阵中值的降序枚举单元格(不是行\列)。所以在我的例子中我想枚举:4,3,2,1并为每个都有索引。

我可以将矩阵展平为1d数组,对数组进行排序并使用其索引恢复到原始矩阵索引。但感觉不对。

python中有一些内置的能力吗?

1 个答案:

答案 0 :(得分:1)

您可以使用np.ndenumerate来获取索引和值的迭代器。

您可以将其转换为列表:

>>> import numpy as np
>>> m = np.matrix('1 2; 3 4')
>>> list(np.ndenumerate(m))
[((0, 0), 1), ((0, 1), 2), ((1, 0), 3), ((1, 1), 4)]

按值排序:

>>> sorted([(v, i) for (i,v) in np.ndenumerate(m)], reverse=True)
[(4, (1, 1)), (3, (1, 0)), (2, (0, 1)), (1, (0, 0))]

并提取索引:

>>> [i for (_, i) in sorted([(v, i) for (i,v) in np.ndenumerate(m)], reverse=True)]
[(1, 1), (1, 0), (0, 1), (0, 0)]

我不知道是否可以用更少的步骤来做到这一点。这是另一个矩阵的例子:

>>> m = np.matrix('1 4; 3 2')
>>> [i for (_, i) in sorted([(v, i) for (i,v) in np.ndenumerate(m)], reverse=True)]
[(0, 1), (1, 0), (1, 1), (0, 0)]

混合numpy和vanilla列表理解可能看起来很混乱。问题是ndenumerate返回一个迭代器。你可以使用:

np.fromiter(np.ndenumerate(m), np.dtype('2i, 1i'))

但它是一个一元组的元组,它不会使索引或排序更容易。