TensorFlow2.0(3):張量排序、最大最小值


1 排序

1.1 sort:返回排序后的Tensor

import tensorflow as tf
a = tf.random.shuffle(tf.range(6))
a
<tf.Tensor: id=4, shape=(6,), dtype=int32, numpy=array([3, 2, 4, 5, 0, 1], dtype=int32)>
tf.sort(a)     # 默認是順序排列
<tf.Tensor: id=15, shape=(6,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5], dtype=int32)>
tf.sort(a,direction='ASCENDING')     # 默認順序排列
<tf.Tensor: id=26, shape=(6,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5], dtype=int32)>
tf.sort(a,direction='DESCENDING')     # 指定逆序排列
<tf.Tensor: id=34, shape=(6,), dtype=int32, numpy=array([5, 4, 3, 2, 1, 0], dtype=int32)>

      也可以對多維Tensor進行排序,當對多維Tensor進行排序時,可以通過axis參數指定需要排序的維度,axis的默認值為-1,也就是對最后一維進行排序。

b = tf.random.uniform([3,3],minval=1,maxval=10,dtype=tf.int32)
b
<tf.Tensor: id=39, shape=(3, 3), dtype=int32, numpy=
array([[1, 9, 8],
       [3, 4, 9],
       [5, 1, 5]], dtype=int32)>
tf.sort(b)
<tf.Tensor: id=50, shape=(3, 3), dtype=int32, numpy=
array([[1, 8, 9],
       [3, 4, 9],
       [1, 5, 5]], dtype=int32)>
tf.sort(b,axis=0)     # 通過axis參數指定第0維度,也就是對列進行排序
<tf.Tensor: id=64, shape=(3, 3), dtype=int32, numpy=
array([[1, 1, 5],
       [3, 4, 8],
       [5, 9, 9]], dtype=int32)>

1.2 argsort:返回排序后的索引

a
<tf.Tensor: id=4, shape=(6,), dtype=int32, numpy=array([3, 2, 4, 5, 0, 1], dtype=int32)>
tf.argsort(a,direction='ASCENDING') # 返回排序之后的索引組成的Tensor,默認是順序排列
<tf.Tensor: id=74, shape=(6,), dtype=int32, numpy=array([4, 5, 1, 0, 2, 3], dtype=int32)>
tf.argsort(a,direction='DESCENDING')   # 逆序排列
<tf.Tensor: id=83, shape=(6,), dtype=int32, numpy=array([3, 2, 0, 1, 5, 4], dtype=int32)>

      可以通過axis參數指定需要排序的維度,默認獲取-1維度排序后的索引。

b
<tf.Tensor: id=39, shape=(3, 3), dtype=int32, numpy=
array([[1, 9, 8],
       [3, 4, 9],
       [5, 1, 5]], dtype=int32)>
tf.argsort(b)     # 默認對最后一維度排序,也就是以行為單位排序
<tf.Tensor: id=93, shape=(3, 3), dtype=int32, numpy=
array([[0, 2, 1],
       [0, 1, 2],
       [1, 0, 2]], dtype=int32)>
tf.argsort(b,axis=0)     # 指定第0維度進行排序,也就是以列為單位進行排序
<tf.Tensor: id=106, shape=(3, 3), dtype=int32, numpy=
array([[0, 2, 2],
       [1, 1, 0],
       [2, 0, 1]], dtype=int32)>

      返回的張量中,每一個元素表示b中原來元素在該列中的索引。

1.3 top_k:返回逆序排列后的前k個元素組成的Tensor

      sort()方法和argsort()方法都是對給定Tensor的所有元素進行排序,在某些情況下如果我們只是要獲取排序的前幾個元素,這時候使用sort()或argsort()方法就有些浪費時間了,這時候可以使用top_k()方法。

      top_k()方法可以指定獲取前k個元素。注意:top_k()方法在tf.math模塊中。 

a
<tf.Tensor: id=4, shape=(6,), dtype=int32, numpy=array([3, 2, 4, 5, 0, 1], dtype=int32)>
top_2 = tf.math.top_k(a,2)     # 獲取排序后前兩位
top_2
TopKV2(values=<tf.Tensor: id=108, shape=(2,), dtype=int32, numpy=array([5, 4], dtype=int32)>, indices=<tf.Tensor: id=109, shape=(2,), dtype=int32, numpy=array([3, 2], dtype=int32)>)

      從上述輸出可以看到,top_k()方法返回的是一個TopKV2類型對象,內部包含兩部分數據:第一部分是排序后的真實數據[5,4],可以通過TopKV2對象的values屬性獲取;第二部分是排序后數據所在原Tensor中的索引[3,2],可以通過TokKV2對象的indices獲取。

top_2.values
<tf.Tensor: id=108, shape=(2,), dtype=int32, numpy=array([5, 4], dtype=int32)>
top_2.indices
<tf.Tensor: id=109, shape=(2,), dtype=int32, numpy=array([3, 2], dtype=int32)>

      對於高維Tensor也是一樣的。

b
<tf.Tensor: id=39, shape=(3, 3), dtype=int32, numpy=
array([[1, 9, 8],
       [3, 4, 9],
       [5, 1, 5]], dtype=int32)>
tf.math.top_k(b,2)
TopKV2(values=<tf.Tensor: id=111, shape=(3, 2), dtype=int32, numpy=
array([[9, 8],
       [9, 4],
       [5, 5]], dtype=int32)>, indices=<tf.Tensor: id=112, shape=(3, 2), dtype=int32, numpy=
array([[1, 2],
       [2, 1],
       [0, 2]], dtype=int32)>)

      注意:top_k()方法只能對最后一維度進行排序。

2 最大值、最小值、平均值、和

2.1 reduce_min、reduce_max、reduce_mean、reduce_sum

(1)reduce_min():求最小值

a = tf.random.uniform([3,3],minval=1,maxval=10,dtype=tf.int32)
a
<tf.Tensor: id=116, shape=(3, 3), dtype=int32, numpy=
array([[2, 3, 9],
       [6, 5, 9],
       [7, 3, 8]], dtype=int32)>

      不指定維度時,獲取整個Tensor的最小值。

tf.reduce_min(a)
<tf.Tensor: id=118, shape=(), dtype=int32, numpy=2>

      通過axis參數可以對指定維度求最小值。

tf.reduce_min(a,axis=0)
<tf.Tensor: id=120, shape=(3,), dtype=int32, numpy=array([2, 3, 8], dtype=int32)>

(2)reduce_max():求最大值

tf.reduce_max(a)
<tf.Tensor: id=122, shape=(), dtype=int32, numpy=9>
tf.reduce_max(a,axis=-1)
<tf.Tensor: id=124, shape=(3,), dtype=int32, numpy=array([9, 9, 8], dtype=int32)>

(3)reduce_mean():求平均值

      不指定維度時,求整個Tensor所有元素的平均值。

tf.reduce_mean(a)     # 求整個Tensor所有元素的平均值
<tf.Tensor: id=126, shape=(), dtype=int32, numpy=5>
tf.reduce_mean(a,axis=0)
<tf.Tensor: id=128, shape=(3,), dtype=int32, numpy=array([5, 3, 8], dtype=int32)>

      在上面求均值的例子中,因為Tensor的dtype為int32,所以求出來的均值也是int32,而不是浮點型。如果需要求浮點型的均值,就需要將a的類型先轉換為float32。

tf.reduce_mean(tf.cast(a,tf.float32),axis=0)
<tf.Tensor: id=131, shape=(3,), dtype=float32, numpy=array([5.       , 3.6666667, 8.666667 ], dtype=float32)>

2.2 argmin()、agrmax()

      argmin()、agrmax()返回最大值最小值的索引組成的Tensor。

(1)argmin():求最小值索引

a = tf.random.uniform([3,3],minval=1,maxval=10,dtype=tf.int32)
a
<tf.Tensor: id=135, shape=(3, 3), dtype=int32, numpy=
array([[1, 5, 4],
       [1, 2, 7],
       [2, 6, 9]], dtype=int32)>
b = tf.random.uniform([3,3,3],minval=1,maxval=10,dtype=tf.int32)
b
<tf.Tensor: id=139, shape=(3, 3, 3), dtype=int32, numpy=
array([[[5, 2, 1],
        [5, 6, 3],
        [1, 7, 5]],

       [[1, 9, 2],
        [8, 5, 2],
        [1, 6, 9]],

       [[6, 6, 7],
        [2, 8, 7],
        [2, 2, 9]]], dtype=int32)>
tf.argmin(a)     # 默認是對列操作
<tf.Tensor: id=141, shape=(3,), dtype=int64, numpy=array([0, 1, 0])>
tf.argmin(b)
<tf.Tensor: id=143, shape=(3, 3), dtype=int64, numpy=
array([[1, 0, 0],
       [2, 1, 1],
       [0, 2, 0]])>

      對於shape為(3,3)的Tensor,argmin(a)返回的是shape為(3,)的Tensor,因為沒有指定比較的維度,默認比較的是第0維度的元素,也就是每一列數據;對於shape為(3,3,3)的Tensor,argmin(a)返回的是shape為(3,3)的Tensor,默認比較的是第0維度的元素,也就是每一塊對應位置的元素,例如第一塊的5,第二塊的1,第三塊的6比較, 第二塊的1最小,索引為1,所以返回的Tensor中第一個元素是1。

      注意:argmin()方法在沒有指定維度時,默認返回的是第0維度最小值的索引,這與reduce_min()方法不同,reduce_min()方法在沒有指定維度時,返回的是整個Tensor中所有元素的最小值。

(2)argmax():求最大值索引

a = tf.random.uniform([3,3,3],minval=1,maxval=10,dtype=tf.int32)
a
<tf.Tensor: id=147, shape=(3, 3, 3), dtype=int32, numpy=
array([[[7, 4, 5],
        [1, 1, 4],
        [9, 1, 4]],

       [[9, 4, 2],
        [3, 7, 9],
        [6, 5, 1]],

       [[8, 5, 2],
        [3, 4, 2],
        [5, 1, 4]]], dtype=int32)>
tf.argmax(a,axis=0)     # 第一維度,也就是每一塊
<tf.Tensor: id=149, shape=(3, 3), dtype=int64, numpy=
array([[1, 2, 0],
       [1, 1, 1],
       [0, 1, 0]])>
tf.argmax(a,axis=2)     # 第三維度,也就是每一行
<tf.Tensor: id=151, shape=(3, 3), dtype=int64, numpy=
array([[0, 2, 0],
       [0, 2, 0],
       [0, 1, 0]])>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM