# `array` --- 高效率的數值型陣列

這個模組定義了一個物件型別，可以簡潔的表達一個包含基本數值的陣列：字元、整數、浮點數。陣列是一個非常類似 list（串列）的序列型別，除了陣列會限制儲存的物件型別。在建立陣列時可以使用一個字元的 type code 來指定儲存的資料型別。以下為有被定義的 type codes：

Type code | C Type | Python Type | 所需的最小位元組 (bytes) | 註解
--- | --- | --- | --- | ---
`'b'` | signed char | int | 1 |
`'B'` | unsigned char | int | 1 |
`'u'` | wchar_t | Unicode character | 2 | (1)
`'h'` | signed short | int | 2 |
`'H'` | unsigned short | int | 2 |
`'i'` | signed int | int | 2 |
`'I'` | unsigned int | int | 2 |
`'l'` | signed long | int | 4 |
`'L'` | unsigned long | int | 4 |
`'q'` | signed long long | int | 8 |
`'Q'` | unsigned long long | int | 8 |
`'f'` | float | float | 4 |
`'d'` | double | float | 8 |

註解：

1. 根據平台的不同，它有可能是 16 位元或者 32 位元。

   在 3.9 版的變更: `array('u')` 现在使用 `wchar_t` 作为 C 类型而不是已不建议使用的 `Py_UNICODE`。这个改变不会影响其行为，因为 `Py_UNICODE` 自 Python 3.3 起就是 `wchar_t` 的别名。

   自從版本 3.3 後不推薦使用，將會自版本 4.0 中移除。.

實際上數值的表示方法是被機器的架構所決定（更精準地說，被 C 的實作方法決定）。實際的大小可以透過 `array.itemsize` 屬性存取。

這個模組定義了以下項目：

array.typecodes

  一個包含所有可用的 type codes 的字串。

這個模組定義了下方的型別：

class array.array(typecode[, initializer])

  一个由 typecode 限定其条目的新数组，并能根据可选的 initializer 值来初始化。initializer 必须是 `bytes` 或 `bytearray` 对象、Unicode 字符串或元素类型合适的可迭代对象。

  如果给定了一个 `bytes` 或 `bytearray` 对象，则将 initializer 传给新数组的 `frombytes()` 方法；如果给定了一个 Unicode 字符串，则将 initializer 传给 `fromunicode()` 方法；在其他情况下，则将 initializer 的迭代器传给 `extend()` 方法以向数组添加初始条目。

  陣列支援常見的序列操作，包含索引 (indexing)、切片 (slicing)、串接 (concatenation)、相乘 (multiplication) 等。當使用切片進行賦值時，賦值的陣列必須具備相同的 type code，其他型別的數值將導致 `TypeError`。陣列同時也實作了緩衝區介面，可以在任何支援 bytes-like objects 的地方使用。

  引發稽核事件 (auditing event) `array.__new__` 並帶入引數 `typecode`、`initializer`。

  typecode

    typecode 字元被用在建立陣列時。

  itemsize

    陣列當中的一個元素在內部需要的位元組長度。

  append(x)

    新增一個元素 x 到陣列的最尾端。

  buffer_info()

    回傳一個 tuple `(address, length)` 表示當前的記憶體位置和陣列儲存元素的緩衝區記憶體長度。緩衝區的長度單位是位元組，並可以用 `array.buffer_info()[1] * array.itemsize` 計算得到。這偶爾會在底層操作需要記憶體位置的輸出輸入時很有用，例如 `ioctl()` 指令。只要陣列存在且沒有使用任何更改長度的操作時，回傳的數值就有效。

    備註

    當使用來自 C 或 C++ 程式碼（這是唯一使得這個資訊有效的途徑）的陣列物件時，更適當的做法是使用陣列物件支援的緩衝區介面。這個方法維護了向後兼容性，並應該在新的程式碼中避免。關於緩衝區介面的文件在緩衝協定 (Buffer Protocol)。

  byteswap()

    "Byteswap" 所有陣列中的物件。這只有支援物件長度為 1、2、4 或 8 位元組的陣列，其他型別的值會導致 `RuntimeError`。這在從機器讀取位元順序不同的檔案時很有用。

  count(x)

    回傳 x 在陣列中出現了幾次。

  extend(iterable)

    從 iterable 中新增元素到陣列的尾端，如果 iterable 是另一個陣列，它必須有完全相同的 type code，如果不同會導致 `TypeError`。如果 iterable 不是一個陣列，它必須可以被疊代 (iterable) 且其中的元素必須是可以被加入陣列中的正確型別。

  frombytes(buffer)

    添加来自 bytes-like object 的条目，将其内容解读为由机器值组成的数组（就像是使用 `fromfile()` 方法从文件中读取内容一样）。

    在 3.2 版新加入: 將 `fromstring()` 更名為 `frombytes()`，使其更加清晰易懂。

  fromfile(f, n)

    從 file object f 讀取 n 個元素（作為機器數值），接著將這些元素加入陣列的最尾端。如果只有少於 n 個有效的元素會導致 `EOFError`，但有效的元素仍然會被加入陣列中。

  fromlist(list)

    從 list 中新增元素。這等價於 `for x in list: a.append(x)`，除了有型別錯誤產生時，陣列會保持原狀不會被更改。

  fromunicode(s)

    用给定的 Unicode 字符串中的数据扩展数组。 数组的类型代码必须是 `'u'`，否则会引发 `ValueError` 异常。 使用 `array.frombytes(unicodestring.encode(enc))` 可将 Unicode 数据附加到其他类型的数组中。

  index(x[, start[, stop]])

    回傳 i 的最小數值，使得 i 成為陣列之中第一次出現 x 的索引。選擇性的引數 start 及 stop 則可以被用來在指定的陣列空間中搜尋 x。如果 x 不存在將導致 `ValueError`。

    在 3.10 版的變更: 新增選擇性的參數 start 及 stop。

  insert(i, x)

    在位置 i 之前插入一個元素 x。負數的索引值會從陣列尾端開始數。

  pop([i])

    移除並回傳陣列索引值 i 的元素。選擇性的引數 i 預設為 `-1`，所以預設會刪除並回傳最後一個元素。

  remove(x)

    從陣列中刪除第一個出現的 x。

  reverse()

    反轉陣列中元素的順序。

  tobytes()

    將陣列轉為另一個機器數值組成的陣列並回傳它的位元組表示（跟用 `tofile()` 方法寫入檔案時的位元序列相同）。

    在 3.2 版新加入: 為了明確性，過去的 `tostring()` 已更名為 `tobytes()`。

  tofile(f)

    將所有元素（作為機器數值）寫入 file object f。

  tolist()

    不更改元素，將陣列轉為一般的 list。

  tounicode()

    将数组转换为 Unicode 字符串。 数组的类型必须是 `'u'`；否则会引发 `ValueError` 异常。 使用 `array.tobytes().decode(enc)` 可从其他类型的数组中获取 Unicode字符串。

数组对象的字符串表示形式是 `array(typecode, initializer)`。 如果数组为空 initializer 将被省略，否则如果 typecode 为 `'u'` 则为 Unicode 字符串，否则为由数字组成的列表。 只要 `array` 类是使用 `from array import array` 导入的，该字符串表示形式就保证能使用 `eval()` 转换回具有相同类型和值的数组。 如果它包含相应的浮点数值则还必须定义变量 `inf` 和 `nan`。 例如:

    array('l')
    array('u', 'hello \u2641')
    array('l', [1, 2, 3, 4, 5])
    array('d', [1.0, 2.0, 3.14, -inf, nan])

也參考

`struct` 模組

  將包含不同資料類型的二進位資料包裝與解開包裝。

`xdrlib` 模組

  將 External Data Representation (XDR) 的資料包裝與解開包裝，這用在一些遠端操作的系統 (remote procedure call systems)。

NumPy

  NumPy 套件定義了另一個陣列型別