Python:按数组2-D随机返回最大8个值



我想提取最大x值​​并保存它们的位置。

[[ 5, 57, 66, 59, 26],
[23, 66, 97, 96, 33],
[31, 63, 69, 55, 20],
[ 2, 77, 37, 85, 40],
[87, 94, 43, 92, 44],
]

感谢

在数组上使用maxrange是获得最大元素索引的一种方法:

>>> [max(range(len(row)), key=row.__getitem__) for row in m]
[2, 2, 2, 3, 1]

另一种选择是在获得最大元素本身后使用index(这效率稍低,因为现在你要扫描每行两次,但差异是一个常数(:

>>> [row.index(max(row)) for row in m]
[2, 2, 2, 3, 1]

是否要随机选择nn最大的项目还不完全清楚。我包括两种解释的解决方案,因为它们非常相似

假设您想要从2D阵列中随机选择8个项目及其位置

import numpy as np
x = np.array(
[[ 5, 57, 66, 59, 26],
[23, 66, 97, 96, 33],
[31, 63, 69, 55, 20],
[ 2, 77, 37, 85, 40],
[87, 94, 43, 92, 44]])

创建一个随机布尔矩阵来选择项目

how_many = 8
choices = [True] * how_many + [False] * (len(x.ravel()) - how_many)
choices = np.random.permutation(choices).reshape(x.shape)
x[choices]

输出:

array([66, 59, 23, 33, 63, 69, 20, 40])

获取他们的位置

positions_2D  = np.vstack(np.unravel_index(np.flatnonzero(choices), x.shape)).T
positions_2D

输出:

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

通过二维坐标获取所选项目

x[positions_2D[:,0], positions_2D[:,1]]

输出:

array([66, 59, 23, 33, 63, 69, 20, 40])

如果你想要8个最大的项目,那么在没有布尔数组的情况下选择项目是相同的方法

top_8_positions_in_2D = np.vstack(np.unravel_index(x.argsort(None), x.shape)).T[:-9:-1]
x[top_8_positions_in_2D[:,0], top_8_positions_in_2D[:,1]]

输出:

array([97, 96, 94, 92, 87, 85, 77, 69])

获取他们的二维坐标

top_8_positions_in_2D

输出:

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

最新更新