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ù)操作使用。