给出一个矩阵:
m = np.matrix('1 2; 3 4')
我想按矩阵中值的降序枚举单元格(不是行\列)。所以在我的例子中我想枚举:4,3,2,1并为每个都有索引。
我可以将矩阵展平为1d数组,对数组进行排序并使用其索引恢复到原始矩阵索引。但感觉不对。
python中有一些内置的能力吗?
答案 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'))
但它是一个一元组的元组,它不会使索引或排序更容易。