如何在TensorFlow中对二维张量按元素对完美升序排序?
我来帮你搞定这个排序问题!
你当前的代码只针对二维张量的第一列做了升序排序,但当第一列元素相同时,并没有对第二列做进一步的排序,这就是为什么两个以0.3开头的行顺序不符合预期的原因。
要实现按元素从最小值到最大值的升序排序(也就是先按第一列升序,第一列相同时按第二列升序的字典序排序),可以使用TensorFlow的tf.lexsort函数,它专门处理多列的字典序排序需求。以下是修正后的完整代码:
import tensorflow as tf # 原始输入 a = [[0.3,0.32],[0.1,5.2],[1.6,0.4],[0.3,0.1],[5.2,2.6],[0.5,1.15]] a = tf.convert_to_tensor(a) # 生成字典序排序的索引:先按第一列升序,第一列相同时按第二列升序 # tf.lexsort的参数是排序键列表,最后一个元素是主排序键 indices = tf.lexsort([a[:, 1], a[:, 0]]) # 根据索引重新排列张量行 sorted_a = tf.gather(a, indices) # 输出结果 print(sorted_a.numpy())
运行这段代码后,你会得到预期的完美排序结果:
[[0.1 5.2 ] [0.3 0.1 ] [0.3 0.32] [0.5 1.15] [1.6 0.4 ] [5.2 2.6 ]]
为什么这个方法有效?
tf.lexsort会按照字典序对行进行排序:我们传入的[a[:,1], a[:,0]]表示,先以a[:,0](第一列)作为主排序依据升序排列;当第一列的元素相同时,再以a[:,1](第二列)作为次依据升序排列,正好满足你需要的排序规则。
而你之前的代码仅通过-a[:,0]取top_k,只考虑了第一列的顺序,完全忽略了第二列的排序逻辑,所以才会出现不符合预期的结果。
内容的提问来源于stack exchange,提问作者anne
相关产品推荐
相关产品推荐

