TensorFlow2.0(3):排序及最大、最小、平均值

 

 

 

注:本系列全部博客將持續更新併發布在github上,您能夠經過github下載本系列全部文章筆記文件。javascript

 

1 排序

 

1.1 sort:返回逆序排序後的Tensor

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

也對多維Tensor排序,當對多維Tensor進行排序時,能夠經過axis參數指定須要排序的維度,默認axis默認值爲-1,也就是對最後一維進行排序。css

In [9]:
b = tf.random.uniform([3, 3], minval=1, maxval=10,dtype=tf.int32)
In [10]:
b
Out[10]:
<tf.Tensor: id=46, shape=(3, 3), dtype=int32, numpy=
array([[1, 2, 1],
       [9, 6, 3],
       [6, 4, 1]])>
In [11]:
tf.sort(b)
Out[11]:
<tf.Tensor: id=59, shape=(3, 3), dtype=int32, numpy=
array([[1, 1, 2],
       [3, 6, 9],
       [1, 4, 6]])>
In [13]:
tf.sort(b,axis=0)  # 經過axis參數指定第一維度,也就是列進行排序
Out[13]:
<tf.Tensor: id=91, shape=(3, 3), dtype=int32, numpy=
array([[1, 2, 1],
       [6, 4, 1],
       [9, 6, 3]])>
 

1.2 argsort:返回排序後的索引

In [13]:
a
Out[13]:
<tf.Tensor: id=4, shape=(6,), dtype=int32, numpy=array([1, 3, 2, 4, 5, 0])>
In [16]:
tf.argsort(a, direction='ASCENDING') # 返回排序以後的索引組成的Tensor, 默認是順序排列
Out[16]:
<tf.Tensor: id=125, shape=(6,), dtype=int32, numpy=array([5, 0, 2, 1, 3, 4])>
In [17]:
tf.argsort(a, direction='DESCENDING') # n逆序排列
Out[17]:
<tf.Tensor: id=136, shape=(6,), dtype=int32, numpy=array([4, 3, 1, 2, 0, 5])>
 

能夠經過axis參數指定須要排序的維度,默認獲取-1維度排序後索引:html

In [14]:
b
Out[14]:
<tf.Tensor: id=46, shape=(3, 3), dtype=int32, numpy=
array([[1, 2, 1],
       [9, 6, 3],
       [6, 4, 1]])>
In [17]:
tf.argsort(b)  # 默認對最後一維度排序,也就是以行爲單位排序
Out[17]:
<tf.Tensor: id=134, shape=(3, 3), dtype=int32, numpy=
array([[0, 2, 1],
       [2, 1, 0],
       [2, 1, 0]])>
In [18]:
tf.argsort(b,axis=0)  # 指定第一維度進行排序,也就是以列爲單位進行排序
Out[18]:
<tf.Tensor: id=149, shape=(3, 3), dtype=int32, numpy=
array([[0, 0, 0],
       [2, 2, 2],
       [1, 1, 1]])>
 

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

 

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

 

sort()方法和argsort()方法都是對給定Tensor的全部元素進行排序,在某些狀況下若是咱們只是要獲取排序的前幾個元素,這時候使用sort()或argsort()方法就有些浪費時間了,這時候能夠使用top_k()方法。top_k()方法能夠指定獲取前k個元素。java

 

注意:top_k()方法在tf.math模塊中。node

In [19]:
a
Out[19]:
<tf.Tensor: id=4, shape=(6,), dtype=int32, numpy=array([3, 1, 5, 2, 0, 4])>
In [20]:
top_2 = tf.math.top_k(a, 2)  # 獲取排序後前兩位
In [21]:
top_2
Out[21]:
TopKV2(values=<tf.Tensor: id=153, shape=(2,), dtype=int32, numpy=array([5, 4])>, indices=<tf.Tensor: id=154, shape=(2,), dtype=int32, numpy=array([2, 5])>)
 

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

In [22]:
top_2.values
Out[22]:
<tf.Tensor: id=153, shape=(2,), dtype=int32, numpy=array([5, 4])>
In [23]:
top_2.indices
Out[23]:
<tf.Tensor: id=154, shape=(2,), dtype=int32, numpy=array([2, 5])>
 

對於高維Tensor也是同樣的:jquery

In [37]:
b
Out[37]:
<tf.Tensor: id=152, shape=(3, 3), dtype=int32, numpy=
array([[7, 9, 7],
       [4, 3, 1],
       [1, 1, 6]])>
In [39]:
tf.math.top_k(b, 2)
Out[39]:
TopKV2(values=<tf.Tensor: id=211, shape=(3, 2), dtype=int32, numpy=
array([[9, 7],
       [4, 3],
       [6, 1]])>, indices=<tf.Tensor: id=212, shape=(3, 2), dtype=int32, numpy=
array([[1, 0],
       [0, 1],
       [2, 0]])>)
 

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

 

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

 

2.1 reduce_min、reduce_max、reduce_mean

 

(1)reduce_min():求最小值android

In [24]:
a = tf.random.uniform([3, 3], minval=1, maxval=10, dtype=tf.int32)
In [28]:
a
Out[28]:
<tf.Tensor: id=162, shape=(3, 3), dtype=int32, numpy=
array([[4, 9, 5],
       [8, 6, 1],
       [8, 7, 1]])>
 

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

In [29]:
tf.reduce_min(a)  # 最小值
Out[29]:
<tf.Tensor: id=169, shape=(), dtype=int32, numpy=1>
 

經過axis參數能夠對指定維度求最小值:

In [30]:
 tf.reduce_min(a, axis=0)  # 求指定維度的最小值
Out[30]:
<tf.Tensor: id=172, shape=(3,), dtype=int32, numpy=array([4, 6, 1])>
 

(2)reduce_max():求最大值

In [31]:
tf.reduce_max(a)  # 最大值
Out[31]:
<tf.Tensor: id=175, shape=(), dtype=int32, numpy=9>
In [36]:
 tf.reduce_max(a, axis=-1)  # 求最後一維度的最大值
Out[36]:
<tf.Tensor: id=190, shape=(3,), dtype=int32, numpy=array([9, 8, 8])>
 

(3)reduce_mean():求平均值

 

不指定維度時,求整個Tensor全部元素的平均值:

In [44]:
 tf.reduce_mean(a)  # 整個Tensor全部元素的平均值
Out[44]:
<tf.Tensor: id=227, shape=(), dtype=int32, numpy=4>
In [38]:
tf.reduce_mean(a, axis=0)  # 求第一維度(行)均值
Out[38]:
<tf.Tensor: id=196, shape=(3,), dtype=int32, numpy=array([6, 7, 2])>
 

在上面求均值的例子中,由於Tensor的dtype爲int32,因此求出來的均值也是int32,而不是浮點型。若是須要求浮點型的均值,就須要將a的類型先轉換爲float32:

In [39]:
tf.reduce_mean(tf.cast(a, tf.float32), axis=0)
Out[39]:
<tf.Tensor: id=200, shape=(3,), dtype=float32, numpy=array([6.6666665, 7.3333335, 2.3333333], dtype=float32)>
 

2.2 argmin()、argmax()

 

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

 

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

In [40]:
a = tf.random.uniform([3,3],minval=1, maxval=10, dtype=tf.int32)
In [41]:
a
Out[41]:
<tf.Tensor: id=205, shape=(3, 3), dtype=int32, numpy=
array([[5, 6, 1],
       [3, 7, 2],
       [7, 1, 6]])>
In [42]:
b = tf.random.uniform([3,3,3],minval=1, maxval=10, dtype=tf.int32)
In [43]:
b
Out[43]:
<tf.Tensor: id=210, shape=(3, 3, 3), dtype=int32, numpy=
array([[[5, 4, 7],
        [4, 3, 9],
        [5, 3, 6]],

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

       [[9, 9, 5],
        [5, 4, 4],
        [7, 1, 1]]])>
In [44]:
tf.argmin(a)  # 默認是第0維度
Out[44]:
<tf.Tensor: id=213, shape=(3,), dtype=int64, numpy=array([1, 2, 0], dtype=int64)>
In [45]:
tf.argmin(b)
Out[45]:
<tf.Tensor: id=216, shape=(3, 3), dtype=int64, numpy=
array([[0, 0, 1],
       [1, 1, 2],
       [0, 2, 1]], dtype=int64)>
 

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

 

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

 

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

In [46]:
a = tf.random.uniform([3,3,3],minval=1, maxval=10, dtype=tf.int32)
In [47]:
a
Out[47]:
<tf.Tensor: id=221, shape=(3, 3, 3), dtype=int32, numpy=
array([[[1, 2, 7],
        [9, 3, 3],
        [5, 4, 8]],

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

       [[8, 9, 7],
        [3, 3, 9],
        [7, 7, 2]]])>
In [51]:
tf.argmax(a, axis=0)  # 第一維度,也就是每一塊
Out[51]:
<tf.Tensor: id=233, shape=(3, 3), dtype=int64, numpy=
array([[1, 2, 0],
       [0, 1, 2],
       [2, 2, 0]], dtype=int64)>
In [52]:
tf.argmax(a, axis=2)  # 第三維度,也就是每一行
Out[52]:
<tf.Tensor: id=236, shape=(3, 3), dtype=int64, numpy=
array([[2, 0, 2],
       [0, 1, 0],
       [1, 2, 0]], dtype=int64)>
相關文章
相關標籤/搜索