zoukankan      html  css  js  c++  java
  • 对numpy中shape的理解

    from:http://blog.csdn.net/by_study/article/details/67633593

    环境:Windows, Python3.5

    一维情况:

    >>>> import numpy as np  
    >>> a = np.array([2,3,33])  
    >>> a  
    array([ 2 3 33 ])  
    >>> print(a)  
    [ 2 3 33 ]  
    >>> a.shape  
    (3, )
    >>> a.shape[0]  
    3
    >>> a.shape[1]  
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: tuple index out of range

    一维情况中array创建的可以看做list(或一维数组),创建时用()和[ ]都可以,多维也一样,两种方法创建后的输出显示结果也相同,这里使用[ ]进行创建

    输出a的shape会显示一个参数,就是这个list中元素个数
    创建时也可以直接使用np.zeros([1]),这样会创建全0的list,或者np.ones([1]),不需要我们输入数据,见下图:
    >>>> a = np.zeros([1])  
    b = np.ones([1]) 
    >>> print(a)  
    [ 0. ]  
    >>> print(b)  
    [ 1. ]
    

     

    二维情况:

    >>> a = np.array([[2,3,33],[2,1,1]])
    >>> a
    array([[ 2,  3, 33],
           [ 2,  1,  1]])
    >>> a.shape[0]
    2
    >>> a.shape[1]
    3
    >>> a.shape[2]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: tuple index out of range
    

     二维情况中array创建的可以看做二维数组(矩阵),注意创建时需要使用2个[ ],输出a的shape显示的(2,3)相当于有2行,每行3个数,使用np.ones创建结果如下:

    >>> a = np.ones([2, 3])  
    >>> a
    array([[ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    

    多维情况:

    多维情况统一使用np.ones进行创建,先看三维情况:
    >>> a = np.ones([1,1,1])  
    >>> a
    array([[[ 1.]]])
    >>> a = np.ones([1,1,2])  
    >>> a
    array([[[ 1.,  1.]]])
    >>> a = np.ones([1,2,1])  
    >>> a
    array([[[ 1.],
            [ 1.]]])
    >>> a = np.ones([2,1,1])  
    >>> a
    array([[[ 1.]],
    
           [[ 1.]]])
    

     从上面的代码可以看出,三维情况创建时后面2个参数可以看做是创建二维数组,第1个参数看做创建的二维数组的个数,所以创建时输入的参数为2,3,2时,就相当于创建了2个3行2列的二维数组,如下:

    >>> a = np.ones([2,3,2])  
    >>> a
    array([[[ 1.,  1.],
            [ 1.,  1.],
            [ 1.,  1.]],
    
           [[ 1.,  1.],
            [ 1.,  1.],
            [ 1.,  1.]]])
    

     然后看四维情况:

    >>> a = np.ones([1,1,1,1])  
    >>> a
    array([[[[ 1.]]]])
    >>> a = np.ones([1,1,1,2])  
    >>> a
    array([[[[ 1.,  1.]]]])
    >>> np.ones([1,1,2,1])  
    array([[[[ 1.],
             [ 1.]]]])
    >>> np.ones([1,2,1,1])  
    array([[[[ 1.]],
    
            [[ 1.]]]])
    >>> np.ones([2,1,1,1])  
    array([[[[ 1.]]],
    
    
           [[[ 1.]]]])
    

     从上面代码可以看出:四维时将第一个参数设置为2和第二个参数设置为2时,输出结果中间的空行数量不同,我把它理解成先创建1行1列的二维数组[[ 1. ]],然后按照第2个参数打包这样的二维数组,如果第二个参数是2,则打包2个2维数组变成[[[ 1. ]],[[ 1. ]]](小包),然后按照第1个参数再打包这样的包,如果第一个参数是2,则变成[[[[ 1. ]], [[ 1. ]]], [[[ 1. ]], [[ 1. ]]]](大包),就是下面的结果:

    >>> np.ones([2,2,1,1]) 
    array([[[[ 1.]],
    
            [[ 1.]]],
    
    
           [[[ 1.]],
    
            [[ 1.]]]])
    

     四维以上的结果也是这么理解~输出中区分参数用空行~

     
    然后来看一下特定输出:
    >>> m = np.ones([2,3,2,3])  
    >>> m 
    array([[[[ 1.,  1.,  1.],
             [ 1.,  1.,  1.]],
    
            [[ 1.,  1.,  1.],
             [ 1.,  1.,  1.]],
    
            [[ 1.,  1.,  1.],
             [ 1.,  1.,  1.]]],
    
    
           [[[ 1.,  1.,  1.],
             [ 1.,  1.,  1.]],
    
            [[ 1.,  1.,  1.],
             [ 1.,  1.,  1.]],
    
            [[ 1.,  1.,  1.],
             [ 1.,  1.,  1.]]]])
    >>> m[1,:,:,:]  
    array([[[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]],
    
           [[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]],
    
           [[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]]])
    >>> m[:,1,:,:]  
    array([[[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]],
    
           [[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]]])
    >>> m[:,:,1,:]  
    array([[[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]],
    
           [[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]]])
    >>> m[:,:,:,1]  
    array([[[ 1.,  1.],
            [ 1.,  1.],
            [ 1.,  1.]],
    
           [[ 1.,  1.],
            [ 1.,  1.],
            [ 1.,  1.]]])
    
    然后m[1,:,:,:],:代表默认值(就是一开始你输入时指定的值),这句代码相当于输出2个包中的第1个包(从0开始计数),这个包里面有3个小包,小包里面是2*3的二维数组,所以结果就是上面的~
    然后m[:,1,:,:],相当于输出2个大包,每个大包输出第1个小包,小包里面是2*3的二维数组
    然后m[:,:,1,:],相当于输出2个大包,每个大包输出3个小包,小包里面是二维数组的第1行
    然后m[:,:,:,1],相当于输出2个大包,每个大包输出3个小包,小包里面是1*2的二维数组
    其他结果可以自己去试试~
     
    总结:采用np.array()创建时需要几个维度就要用几个[ ]括起来,这种创建方式要给定数据;采用np.ones()或np.zeros()创建分别产生全1或全0的数据,用a.shape会输出你创建时的输入,创建时输入了几个维度输出就会用几个[ ]括起来,shape的返回值是一个元组,里面每个数字表示每一维的长度
    np.shape[]是对应到某一维上输出指定维的长度

     

  • 相关阅读:
    CS231n assignment3 Q1 Image Captioning with Vanilla RNNs
    使用tensorflow预测函数的参数值(a simple task)
    CS231n assignment2 Q5 TensorFlow on CIFAR-10
    CS231n assignment2 Q4 Convolutional Networks
    HDU 1561 The more, The Better
    HDU4003 Find Metal Mineral
    poj 1947 Rebuilding Roads
    2090 背包
    poj 2408 Apple Tree
    奔跑的xiaodao
  • 原文地址:https://www.cnblogs.com/lindaxin/p/8074921.html
Copyright © 2011-2022 走看看