numpy中shape的理解

本文参考自: 原文地址

一维情况:

  1. >>> import numpy as np
  2. >>> a = np.array([ 2, 3, 33])
  3. >>> a
  4. array([ 2 3 33 ])
  5. >>> print a
  6. [ 2 3 33 ]
  7. >>> a.shape
  8. ( 3, )
一维情况中array创建的可以看做list(或一维数组),创建时用()和[ ]都可以,多维也一样,两种方法创建后的输出显示结果也相同,这里使用[ ]进行创建
输出a的shape会显示一个参数,就是这个list中元素个数
创建时也可以直接使用np.zeros([1]),这样会创建全0的list,或者np.ones([1]),不需要我们输入数据,见下图:
  1. >>> a = np.zeros([1])
  2. >>> b = np.ones([ 1])
  3. >>> print a
  4. [ 0. ]
  5. >>> print b
  6. [ 1. ]

二维情况:

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

多维情况:

多维情况统一使用np.ones进行创建,先看三维情况:
  1. >>> a = np.ones([1,1,1])
  2. >>> print a
  3. [[[ 1.]]]
  4. >>> a = np.ones([ 1, 1, 2])
  5. >>> print a
  6. [[[ 1. 1.]]]
  7. >>> a = np.ones([ 1, 2, 1])
  8. >>> print a
  9. [[[ 1.]
  10. [ 1.]]]
  11. >>> a = np.ones([ 2, 1, 1])
  12. >>> print a
  13. [[[ 1.]]
  14. [[ 1.]]]
从上面的代码可以看出, 三维情况创建时后面2个参数可以看做是创建二维数组,第1个参数看做创建的二维数组的个数,所以创建时输入的参数为2,3,2时,就相当于创建了2个3行2列的二维数组 ,如下:
  1. >>> a = np.ones([2,3,2])
  2. >>> print a
  3. [[[ 1. 1.]
  4. [ 1. 1.]
  5. [ 1. 1.]]
  6. [[ 1. 1.]
  7. [ 1. 1.]
  8. [ 1. 1.]]]
然后看四维情况:
  1. >>> a = np.ones([1,1,1,1])
  2. >>> print a
  3. [[[[ 1.]]]]
  4. >>> a = np.ones([ 1, 1, 1, 2])
  5. >>> print a
  6. [[[[ 1. 1.]]]]
  7. >>> a = np.ones([ 1, 1, 2, 1])
  8. >>> print a
  9. [[[[ 1.]
  10. [ 1.]]]]
  11. >>> a = np.ones([ 1, 2, 1, 1])
  12. >>> print a
  13. [[[[ 1.]]
  14. [[ 1.]]]]
  15. >>> a = np.ones([ 2, 1, 1, 1])
  16. >>> print a
  17. [[[[ 1.]]]
  18. [[[ 1.]]]]
从上面代码可以看出:四维时将第一个参数设置为2和第二个参数设置为2时,输出结果中间的空行数量不同,我把它理解成先创建1行1列的二维数组[[ 1. ]],然后按照第2个参数打包这样的二维数组,如果第二个参数是2,则打包2个2维数组变成[[[ 1. ]],[[ 1. ]]](小包),然后按照第1个参数再打包这样的包,如果第一个参数是2,则变成[[[[ 1. ]], [[ 1. ]]], [[[ 1. ]], [[ 1. ]]]](大包),就是下面的结果:
  1. >>> a = np.ones([2,2,1,1])
  2. >>> print a
  3. [[[[ 1.]]
  4. [[ 1.]]]
  5. [[[ 1.]]
  6. [[ 1.]]]]
四维以上的结果也是这么理解~输出中区分参数用空行~
然后来看一下特定输出:
  1. >>> import numpy as np
  2. >>> m = np.ones([ 2, 3, 2, 3])
  3. >>> print m
  4. [[[[ 1. 1. 1.]
  5. [ 1. 1. 1.]]
  6. [[ 1. 1. 1.]
  7. [ 1. 1. 1.]]
  8. [[ 1. 1. 1.]
  9. [ 1. 1. 1.]]]
  10. [[[ 1. 1. 1.]
  11. [ 1. 1. 1.]]
  12. [[ 1. 1. 1.]
  13. [ 1. 1. 1.]]
  14. [[ 1. 1. 1.]
  15. [ 1. 1. 1.]]]]
  16. >>> print m[ 1,:,:,:]
  17. [[[ 1. 1. 1.]
  18. [ 1. 1. 1.]]
  19. [[ 1. 1. 1.]
  20. [ 1. 1. 1.]]
  21. [[ 1. 1. 1.]
  22. [ 1. 1. 1.]]]
  23. >>> print m[:, 1,:,:]
  24. [[[ 1. 1. 1.]
  25. [ 1. 1. 1.]]
  26. [[ 1. 1. 1.]
  27. [ 1. 1. 1.]]]
  28. >>> print m[:,:, 1,:]
  29. [[[ 1. 1. 1.]
  30. [ 1. 1. 1.]
  31. [ 1. 1. 1.]]
  32. [[ 1. 1. 1.]
  33. [ 1. 1. 1.]
  34. [ 1. 1. 1.]]]
  35. >>> print m[:,:,:, 1]
  36. [[[ 1. 1.]
  37. [ 1. 1.]
  38. [ 1. 1.]]
  39. [[ 1. 1.]
  40. [ 1. 1.]
  41. [ 1. 1.]]]
前面print m很好理解~
然后print m[1,:,:,:],:代表默认值(就是一开始你输入时指定的值),这句代码相当于输出2个包中的第1个包(从0开始计数),这个包里面有3个小包,小包里面是2*3的二维数组,所以结果就是上面的~
然后print m[:,1,:,:],相当于输出2个大包,每个大包输出第1个小包,小包里面是2*3的二维数组
然后print m[:,:,1,:],相当于输出2个大包,每个大包输出3个小包,小包里面是二维数组的第1行
然后print m[:,:,:,1],相当于输出2个大包,每个大包输出3个小包,小包里面是1*2的二维数组
其他结果可以自己去试试~

总结:采用np.array()创建时需要几个维度就要用几个[ ]括起来,这种创建方式要给定数据;采用np.ones()或np.zeros()创建分别产生全1或全0的数据,用a.shape会输出你创建时的输入,创建时输入了几个维度输出就会用几个[ ]括起来,shape的返回值是一个元组,里面每个数字表示每一维的长度

猜你喜欢

转载自blog.csdn.net/u014333268/article/details/81585206
今日推荐