我想提取最大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],
]
感谢
在数组上使用max
和range
是获得最大元素索引的一种方法:
>>> [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]
是否要随机选择n
或n
最大的项目还不完全清楚。我包括两种解释的解决方案,因为它们非常相似
假设您想要从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]])