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

Python和tensorflow编程中经常见这三种shape的用法,容易混淆,特写一篇文章来总结以备遗忘。这三个函数都是用来获取维度信息的,但用法和使用对象各有不同,下面进行一一介绍。

(1) np.shape()

这个函数是numpy中的一个函数(函数要加括号!!!),其功能是获取括号内数据的长度或维度信息,其使用对象既可以是一个数,也可以是数组或矩阵。如下例所示:

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数据类型的一个属性。我们先来理解一下几个问题:

1.什么是ndarray数据类型?

ndarray是numpy库中的一种数据类型,凡是以np.array()定义的数据都是ndarray类型,就跟pytorch中的张量tensor类似。

2.什么是属性?

属性就是python类中初始化的时候,self.xx代表的变量,是该类特有的信息。比如我们定义一个学生类:

class Student:
        def __init__(self, height, weight, number):
                self.height = height  # 身高
                self.weight = weight  # 体重
                self.number = number  # 学号

Student类中的self.height,self.weight ,self.number就是属性。如果ZhangSan是一个Student类,我们想要获知张三的身高体重学号等信息,就采用ZhangSan.height,ZhanSan.weight,ZhangSan.number即可获得,并且可以看到这里的属性是不带括号的
在Python中,一切数据对象都是一个类,包括ndarray类型。shape就是ndarray数据的一个属性,shape表示这个ndarray实例的形状,即各维度的数值。dtype也是其属性之一,即datatype得缩写,表示这个ndarray实例的数据类型。
需要注意的就是注意属性不加括号!!!使用方法如下:

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都当做Python的一个类,ndarray.shape表示ndarray的属性,自然可知,np.shape()其实就是numpy类的方法。
在numpy中,一般可直接用于ndarray类型数据上的方法也有与之对应的numpy函数可执行相同操作,如:

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

记住,函数或方法很像,都要带括号!!!属性不带括号!!!

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               #获取矩阵数据类型                                                 
Out[60]: dtype('float64')

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

这是tensorflow中常用于获取tensor维度信息的函数,注意该函数只能用于tensor对象。Tensor.get_shape()本身获取tensor的维度信息并以元组的形式返回,由于元组内容不可更改,故该函数常常跟.as_list()连用,返回一个tensor维度信息的列表,以供后续操作使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容