用人話說 Numpy – 2/13 陣列Array

用人話說 Numpy andy 4年前 (2020-11-20) 1183次浏览 已收录 0个评论 扫描二维码

用人話說 Numpy – 2/13 陣列Array

NumPy 的主要特色就是 array 物件類別。陣列類似於 Python 的列表 list ,除了陣列內的每個元素都要是相同的類型,通常是整數 int 或是浮點數 float 。陣列使得操作巨大的數值可以很快速,並且比 list 更有效率。
陣列可以從 list 建立

  1. >>> a = np.array([1, 4, 5, 8], float)
  2. >>> a
  3. array([ 1., 4., 5., 8.])
  4. >>> type(a)
  5. <type 'numpy.ndarray'>

這裡的 array 函數接收了兩個參數:第一個是要轉換成陣列的列表,第二個是每一個成員的類型。陣列的元素是可以訪問的,可以切片的,可以操作的。

  1. >>> a[:2]
  2. array([ 1., 4.])
  3. >>> a[3]
  4. 8.0
  5. >>> a[0] = 5.
  6. >>> a
  7. array([ 5., 4., 5., 8.])

陣列可以是多維的。跟列表不同,陣列的不同維度用逗號在括號內分隔。以下是一個二維陣列(也叫矩陣)的範例

  1. >>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
  2. >>> a
  3. array([[ 1., 2., 3.],
  4. [ 4., 5., 6.]])
  5. >>> a[0,0]
  6. 1.0
  7. >>> a[0,1]
  8. 2.0

陣列的切片在操作多維的陣列時跟處理一般陣列時一樣,陣列像是通過一個過濾器一樣,使過濾後的每個切片都是指定規範的維度。使用符號”:”
在一個維度上過濾該維度的所有內容

  1. >>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
  2. >>> a[1,:]
  3. array([ 4., 5., 6.])
  4. >>> a[:,2]
  5. array([ 3., 6.])
  6. >>> a[-1:,-2:]
  7. array([[ 5., 6.]])

屬性 shape 會返回陣列的每一維的數量,返回的型態是 tuple 。

  1. >>> a.shape
  2. (2, 3)

屬性 dtype 返回陣列內的類型

  1. >>> a.dtype
  2. dtype('float64')

這裡顯示的 float64 是數值類型,NumPy 用來存放雙精度(8-byte)的實數,像是 Python 裡的 float 類型。
當函數 len 用在陣列時,會返回第一個維度的長度(數量)

  1. >>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
  2. >>> len(a)
  3. 2

使用 in 語句,可以用來測試一個值是不是存在陣列之內

  1. >>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
  2. >>> 2 in a
  3. True
  4. >>> 0 in a
  5. False

陣列可以用 reshape 方法,以 tuple 做為參數轉換成新的維度。在接下來的範例,把10個元素的一維陣列轉換成二維陣列第一個維度有五個元素,第二個維度有兩個元素

  1. >>> a = np.array(range(10), float)
  2. >>> a
  3. array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
  4. >>> a = a.reshape((5, 2))
  5. >>> a
  6. array([[ 0., 1.],
  7. [ 2., 3.],
  8. [ 4., 5.],
  9. [ 6., 7.],
  10. [ 8., 9.]])
  11. >>> a.shape
  12. (5, 2)

這裡注意 reshape 函數是建立一個新的陣列,而不是修改原始的陣列。
記得 Python 的名稱綁定方式仍然作用於陣列。copy 方法可以用來建立一個新的陣列,如果需要
可以在記憶體內分離複本。

  1. >>> a = np.array([1, 2, 3], float)
  2. >>> b = a
  3. >>> c = a.copy()
  4. >>> a[0] = 0
  5. >>> a
  6. array([0., 2., 3.])
  7. >>> b
  8. array([0., 2., 3.])
  9. >>> c
  10. array([1., 2., 3.])

可以從陣列建立列表

  1. >>> a = np.array([1, 2, 3], float)
  2. >>> a.tolist()
  3. [1.0, 2.0, 3.0]
  4. >>> list(a)
  5. [1.0, 2.0, 3.0]
  6. >>> z = a.tolist()
  7. >>> z
  8. [0.0, 2.0, 3.0]
  9. >>> type(z)
  10. <class 'list'>
  11. >>> y = list(a)
  12. >>> y
  13. [0.0, 2.0, 3.0]
  14. >>> type(y)
  15. <class 'list'>

使用 tostring 方法可以把陣列內的原始資料轉換成二進制字串(不是人類可讀的格式)。fromstring 方法可以用這個二進制的數據建立陣列。這些方法對儲存大量數據到檔案來說很方便。

  1. >>> a = array([1, 2, 3], float)
  2. >>> s = a.tostring()
  3. >>> s
  4. '\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00
  5. \x00\x00\x08@'
  6. >>> np.fromstring(s)
  7. array([ 1., 2., 3.])

補充:
.tostring 方法即將被棄用,改名為 .tobytes() 用法及結果都是一樣的

fill 方法可以把陣列填入指定的值。

  1. >>> a = array([1, 2, 3], float)
  2. >>> a
  3. array([ 1., 2., 3.])
  4. >>> a.fill(0)
  5. >>> a
  6. array([ 0., 0., 0.])

陣列的 transpose 方法可以生成陣列的轉置陣列,會生成兩個維度對調的新陣列

  1. >>> a = np.array(range(6), float).reshape((2, 3))
  2. >>> a
  3. array([[ 0., 1., 2.],
  4. [ 3., 4., 5.]])
  5. >>> a.transpose()
  6. array([[ 0., 3.],
  7. [ 1., 4.],
  8. [ 2., 5.]])

多維陣列可以使用 flatten()方法,產生新的一維陣列

  1. >>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
  2. >>> a
  3. array([[ 1., 2., 3.],
  4. [ 4., 5., 6.]])
  5. >>> a.flatten()
  6. array([ 1., 2., 3., 4., 5., 6.])

兩個以上的陣列,可以使用 concatenate 函數,使用 tuple格式的參數將陣列聯集起來

  1. >>> a = np.array([1,2], float)
  2. >>> b = np.array([3,4,5,6], float)
  3. >>> c = np.array([7,8,9], float)
  4. >>> np.concatenate((a, b, c))
  5. array([1., 2., 3., 4., 5., 6., 7., 8., 9.])

如果陣列是多於一維陣列,可以透過指定維度來聯集多維陣列,如果沒有指定維度,NumPy 預設用第一個維度

  1. >>> a = np.array([[1, 2], [3, 4]], float)
  2. >>> b = np.array([[5, 6], [7,8]], float)
  3. >>> np.concatenate((a,b))
  4. array([[ 1., 2.],
  5. [ 3., 4.],
  6. [ 5., 6.],
  7. [ 7., 8.]])
  8. >>> np.concatenate((a,b), axis=0)
  9. array([[ 1., 2.],
  10. [ 3., 4.],
  11. [ 5., 6.],
  12. [ 7., 8.]])
  13. >>> np.concatenate((a,b), axis=1)
  14. array([[ 1., 2., 5., 6.],
  15. [ 3., 4., 7., 8.]])

陣列的維度可以用括號中的 newaxis 常數來增加維度

  1. >>> a = np.array([1, 2, 3], float)
  2. >>> a
  3. array([1., 2., 3.])
  4. >>> a[:,np.newaxis]
  5. array([[ 1.],
  6. [ 2.],
  7. [ 3.]])
  8. >>> a[:,np.newaxis].shape
  9. (3,1)
  10. >>> b[np.newaxis,:]
  11. array([[ 1., 2., 3.]])
  12. >>> b[np.newaxis,:].shape
  13. (1,3)

這裡的範例都是二維的,其中用 np.newaxis 建立的陣列,長度為1。使用 newxis 方式建立陣列,對於向量跟矩陣的數學計算來說很方便。

用人話說 Numpy – 2/13 陣列Array


神隊友學長Andy , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:用人話說 Numpy – 2/13 陣列Array
喜欢 (0)
[320208045@qq.com]
分享 (0)
andy
关于作者:
中年大叔,打拼 like young students.
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址