python - 如何沿轴获取多维数组的 k 个顶部元素,而不是 argmax 给出的元素
问题描述
我有一个格式为 np.argmax(model.predict(X),axis=2) 的预测,它返回一个元素。如何使用 numpy 预测前 k 个元素
解决方案
@desertnaut 提供的链接涵盖了 1D 案例。然而,将“ND 沿轴”的好答案概括起来并不是一件容易的事。
这是一个示例,我们沿着轴 1 找到顶部 2:
>>> a = np.random.randint(0, 9, (3, 5, 6))
>>> b = a.argpartition(-2, axis=1)[:, -2:]
>>> i, j, k = a.shape
>>> i, j, k = np.ogrid[:i, :j, :k]
>>> b = b[i, a[i, b, k].argsort(axis=1), k]
>>> a
array([[[8, 4, 1, 2, 4, 8],
[0, 1, 3, 4, 2, 7],
[4, 2, 7, 8, 1, 4],
[1, 6, 2, 0, 3, 7],
[1, 0, 0, 2, 8, 1]],
[[1, 6, 3, 3, 0, 6],
[7, 2, 0, 3, 8, 5],
[5, 0, 1, 1, 7, 4],
[2, 2, 4, 2, 6, 2],
[5, 5, 7, 6, 8, 1]],
[[4, 4, 4, 6, 2, 5],
[2, 7, 8, 2, 6, 0],
[5, 6, 7, 5, 1, 6],
[6, 5, 3, 2, 2, 3],
[5, 1, 8, 1, 6, 8]]])
>>> a[i, b, k]
array([[[4, 4, 3, 4, 4, 7],
[8, 6, 7, 8, 8, 8]],
[[5, 5, 4, 3, 8, 5],
[7, 6, 7, 6, 8, 6]],
[[5, 6, 8, 5, 6, 6],
[6, 7, 8, 6, 6, 8]]])
一般功能可能看起来像
def argtopk(A, k, axis=0):
tk = A.argpartition(-k, axis=axis)[(*axis*(slice(None),), slice(-k, None))]
I = np.ogrid[(*map(slice, A.shape),)]
I[axis] = tk
I[axis] = A[I].argsort(axis=axis)
return tk[I]
推荐阅读
- r - 存储在 For 循环 (r) 中的动态变量名称
- python - 单击导航栏有效。但是 HTML href 指向别的东西
- algorithm - 遍历 XORLinkedList 以添加节点的问题
- ios - 无法比较 didUpdateLocations 中的 Firebase 纬度/经度值
- oracle - 通过没有 id/key 的时间戳查询性能匹配调用
- python - 在 Keras 中保存模型时引发“无法创建组(名称已存在)”错误
- java - Eclipse 安装程序是否在 Windows 注册表中创建条目?
- python - 如何从搅拌机 API 2.79 中的网格中获取面列表
- spring - Spring 集成:带蛇壳的 Json 转换器
- javascript - 如何将对象从 Javascript (Adobe CEP) 传递给 Adobe ExtendScript?