python中的.shape(), .shape 和 tensorflow中的 .get_shape().as_list()詳解

Python和tensorflow編程中經(jīng)常見這三種shape的用法,容易混淆,特寫一篇文章來總結(jié)以備遺忘。這三個(gè)函數(shù)都是用來獲取維度信息的,但用法和使用對(duì)象各有不同,下面進(jìn)行一一介紹。

(1) np.shape()

這個(gè)函數(shù)是numpy中的一個(gè)函數(shù)(函數(shù)要加括號(hào)!??!),其功能是獲取括號(hào)內(nèi)數(shù)據(jù)的長(zhǎng)度或維度信息,其使用對(duì)象既可以是一個(gè)數(shù),也可以是數(shù)組或矩陣。如下例所示:

In [1]: import numpy as np                                                      

In [2]: np.shape(0)                                                             
Out[2]: ()

In [3]: np.shape([0])                                                           
Out[3]: (1,)

In [4]: np.shape([1, 2, 3])                                                     
Out[4]: (3,)

In [5]: np.shape([[1], [2]])                                                    
Out[5]: (2, 1)

In [12]: a = np.zeros([2,3])                                                    

In [13]: a                                                                      
Out[13]: 
array([[0., 0., 0.],
       [0., 0., 0.]])

In [14]: np.shape(a)                                                            
Out[14]: (2, 3)

In [15]: np.shape(a)[1]                                                         
Out[15]: 3

(2) array.shape

array.shape是numpy中ndarray數(shù)據(jù)類型的一個(gè)屬性。我們先來理解一下幾個(gè)問題:

1.什么是ndarray數(shù)據(jù)類型?

ndarray是numpy庫(kù)中的一種數(shù)據(jù)類型,凡是以np.array()定義的數(shù)據(jù)都是ndarray類型,就跟pytorch中的張量tensor類似。

2.什么是屬性?

屬性就是python類中初始化的時(shí)候,self.xx代表的變量,是該類特有的信息。比如我們定義一個(gè)學(xué)生類:

class Student:
        def __init__(self, height, weight, number):
                self.height = height  # 身高
                self.weight = weight  # 體重
                self.number = number  # 學(xué)號(hào)

Student類中的self.height,self.weight ,self.number就是屬性。如果ZhangSan是一個(gè)Student類,我們想要獲知張三的身高體重學(xué)號(hào)等信息,就采用ZhangSan.height,ZhanSan.weight,ZhangSan.number即可獲得,并且可以看到這里的屬性是不帶括號(hào)的。
在Python中,一切數(shù)據(jù)對(duì)象都是一個(gè)類,包括ndarray類型。shape就是ndarray數(shù)據(jù)的一個(gè)屬性,shape表示這個(gè)ndarray實(shí)例的形狀,即各維度的數(shù)值。dtype也是其屬性之一,即datatype得縮寫,表示這個(gè)ndarray實(shí)例的數(shù)據(jù)類型。
需要注意的就是注意屬性不加括號(hào)?。?!使用方法如下:

In [16]: b = np.array([[1,2,3],[4,5,6],[7,8,9]])                                

In [17]: b                                                                      
Out[17]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [18]: b.shape                                                                
Out[18]: (3, 3)

In [19]: b.shape[0]                                                             
Out[19]: 3

In [20]: c = [1, 2, 3]        # c不是ndarray類型                                                  

In [21]: c.shape                                                                
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-21-d6049491b182> in <module>
----> 1 c.shape

AttributeError: 'list' object has no attribute 'shape'

從類的角度看,把ndarray和numpy都當(dāng)做Python的一個(gè)類,ndarray.shape表示ndarray的屬性,自然可知,np.shape()其實(shí)就是numpy類的方法。
在numpy中,一般可直接用于ndarray類型數(shù)據(jù)上的方法也有與之對(duì)應(yīng)的numpy函數(shù)可執(zhí)行相同操作,如:

In [52]: a = np.arange(5)                                                       

In [53]: a                                                                      
Out[53]: array([0, 1, 2, 3, 4])

In [54]: np.sum(a)                                                              
Out[54]: 10

In [55]: a.sum()                                                                
Out[55]: 10

記住,函數(shù)或方法很像,都要帶括號(hào)!??!屬性不帶括號(hào)?。?!

In [56]: a = np.random.randn(5,3)                                               

In [57]: a                                                                      
Out[57]: 
array([[-0.47169257, -1.33625595,  1.09450799],
       [ 0.68097098, -0.77349608, -0.13462524],
       [ 1.01122524, -0.72573122, -2.80145914],
       [ 0.32187105,  0.66012558, -0.80316889],
       [-0.79434656,  0.33565231, -0.51083857]])

In [58]: a.shape              #獲取矩陣大小                                                  
Out[58]: (5, 3)

In [59]: a.ndim                #獲取矩陣維度                                                
Out[59]: 2

In [60]: a.dtype               #獲取矩陣數(shù)據(jù)類型                                                 
Out[60]: dtype('float64')

(3) Tensor.get_shape().as_list()

這是tensorflow中常用于獲取tensor維度信息的函數(shù),注意該函數(shù)只能用于tensor對(duì)象。Tensor.get_shape()本身獲取tensor的維度信息并以元組的形式返回,由于元組內(nèi)容不可更改,故該函數(shù)常常跟.as_list()連用,返回一個(gè)tensor維度信息的列表,以供后續(xù)操作使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容