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的返回值是一個元組,裏面每個數字表示每一維的長度
發佈了39 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章