如何在不重复元素的情况下从张量中选择top-n个元素?

潜行:

鉴于拾取的元素都是唯一的,我想选择3维张量的top-n个元素。所有元素都按第二列排序,在下面的示例中,我选择了top-2,但我不想在其中重复。

  • 条件:for loopstf.map_fn()

  • 这是我想要的输入和期望的输出:

input_tensor = tf.constant([
  [[2.0, 1.0],
   [2.0, 1.0],
   [3.0, 0.4],
   [1.0, 0.1]],
  [[44.0, 0.8],
   [22.0, 0.7],
   [11.0, 0.5],
   [11.0, 0.5]],
  [[5555.0, 0.8],
   [3333.0, 0.7],
   [4444.0, 0.4],
   [1111.0, 0.1]],
  [[444.0, 0.8],
   [333.0, 1.1],
   [333.0, 1.1],
   [111.0, 0.1]]
])
  • 这就是我现在要得到的。我不要!
>> TOPK = 2
>> topk_resutls = tf.gather(
    input_tensor,
    tf.math.top_k(input_tensor[:, :, 1], k=TOPK, sorted=True).indices,
    batch_dims=1
)
>> topk_resutls.numpy().tolist()
[[[2.0, 1.0], [2.0, 1.0]],
 [[44.0, 0.8], [22.0, 0.7]],
 [[5555.0, 0.8], [3333.0, 0.7]],
 [[333.0, 1.1], [333.0, 1.1]]]
  • 这是我真正想要的
[[[2.0, 1.0], [3.0, 0.4]],       # [3.0, 0.4] is the 2nd highest element based on 2nd column
 [[44.0, 0.8], [22.0, 0.7]],   
 [[5555.0, 0.8], [3333.0, 0.7]],
 [[333.0, 1.1], [444.0, 0.8]]]   # [444.0, 0.8] is the 2nd highest element based on 2nd column
jdehesa:

这是一种可行的方法,尽管由于它首先对数组进行排序,因此需要做更多的工作。

import tensorflow as tf
import numpy as np

# Input data
k = 2
input_tensor = tf.constant([
  [[2.0, 1.0],
   [2.0, 1.0],
   [3.0, 0.4],
   [1.0, 0.1]],
  [[44.0, 0.8],
   [22.0, 0.7],
   [11.0, 0.5],
   [11.0, 0.5]],
  [[5555.0, 0.8],
   [3333.0, 0.7],
   [4444.0, 0.4],
   [1111.0, 0.1]],
  [[444.0, 0.8],
   [333.0, 1.1],
   [333.0, 1.1],
   [111.0, 0.1]]
])
# Sort by first column
idx = tf.argsort(input_tensor[..., 0], axis=-1)
s = tf.gather_nd(input_tensor, tf.expand_dims(idx, axis=-1), batch_dims=1)
# Find repeated elements
col1 = s[..., 0]
col1_ext = tf.concat([col1[..., :1] - 1, col1], axis=-1)
mask = tf.math.not_equal(col1_ext[..., 1:], col1_ext[..., :-1])
# Replace value for repeated elements with "minus infinity"
col2 = s[..., 1]
col2_masked = tf.where(mask, col2, col2.dtype.min)
# Get top-k results
topk_idx = tf.math.top_k(col2_masked, k=k, sorted=True).indices
topk_results = tf.gather(s, topk_idx, batch_dims=1)
# Print
with np.printoptions(suppress=True):
    print(topk_results.numpy())
# [[[   2.     1. ]
#   [   3.     0.4]]
# 
#  [[  44.     0.8]
#   [  22.     0.7]]
# 
#  [[5555.     0.8]
#   [3333.     0.7]]
# 
#  [[ 333.     1.1]
#   [ 444.     0.8]]]

请注意,存在一种极端情况,即k中没有不同的元素。在这种情况下,此解决方案会将重复的元素放在末尾,这会破坏得分顺序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 C++ 中创建一个算法来在不重复的情况下查找集合的变体(即 n 个元素,选择 k)?

如何在不重复两个连续元素的情况下重新排列数字数组?

如何在不重复的情况下选择小于n的k个数字?

如何在不创建新元素的情况下更改列表中的n个连续元素?

如何在不重新生成元素的情况下插入元素的精确副本

在重复的随机选择中不重复元素

如何在Java中从集合中选择一些元素而不重复?

如何在不重复的情况下在双向链表中插入元素?

如何在不重复数组的情况下仅获取1个参数

如何在不重新加载页面的情况下刷新angular 8中的元素?

如何在不选择子元素的情况下选择元素

如何在不重复预定义三元组中特定元素的情况下将向量随机化?

在不考虑相同数组位置的情况下计算重复元素的问题

在不使用 distinct() 方法的情况下查找整数列表中的重复元素

从 n 个元素的数组中选择 5 个元素并对这 5 个元素应用冒泡排序

如何在不使用jQuery的情况下基于子元素的文本选择父元素?

如何在元组中重复元素n次

是否有一个 Python 函数可以在不重复某些元素的情况下进行排列?

列表中的第n个重复元素

如何在不循环的情况下对数据帧的n个元素的移动子集执行计算

如何在不调用“ next_element”方法的情况下使用Nokogiri选择下一个元素?

如何在两个元素之间的数据属性相同的情况下创建CSS选择器?

Shell脚本-如何在不重复行的情况下合并两个文本文件

如何在Wordpress自定义帖子中不重复的情况下循环进入两个不同的DIVS

如何在不重用JavaScript的情况下重复使用一个对象的多个实例

如何在不重复的情况下将多个data.frame中的向量集集成为一个?

如何在不重复治疗的情况下使用R将治疗者随机分为五个区块?

如何在没有包装元素的情况下重复内容(aka * ngFor)?

如何在不改变数组本身的情况下重复重新排序数组的元素?