array --- 高效的數值陣列


此模組定義了一種物件型別,可以緊湊地表示基本值的陣列:字元、整數、浮點數。陣列是序列型別,其行為與列表非常相似,但其中儲存的物件型別是受限的。型別是在物件建立時透過使用一個*型別碼*指定的,該型別碼是單個字元。定義了以下型別碼:

型別碼

C 型別

Python 型別

最小位元組數

備註

'b'

signed char

int

1

'B'

unsigned char

int

1

'u'

wchar_t

Unicode 字元

2

(1)

'w'

Py_UCS4

Unicode 字元

4

(2)

'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'

浮點數

浮點數

4

'd'

double

浮點數

8

備註

  1. 根據平臺的不同,可以是 16 位或 32 位。

    在 3.9 版本發生變更: array('u') 現在使用 wchar_t 作為 C 型別,而不是已棄用的 Py_UNICODE。此更改不影響其行為,因為自 Python 3.3 起,Py_UNICODE 就是 wchar_t 的別名。

    從 3.3 版起棄用,將在 3.16 版中移除: 請遷移到 'w' 型別碼。

  2. 在 3.13 版本加入。

值的實際表示由機器架構(嚴格來說,由 C 實現)決定。實際大小可以透過 array.itemsize 屬性訪問。

該模組定義了以下項:

array.typecodes

一個包含所有可用型別碼的字串。

該模組定義了以下型別:

class array.array(typecode[, initializer])

一個新陣列,其元素受 *typecode* 限制,並由可選的 *initializer* 值進行初始化,該值必須是 bytesbytearray 物件、Unicode 字串,或包含適當型別元素的可迭代物件。

如果給定一個 bytesbytearray 物件,初始化程式將被傳遞給新陣列的 frombytes() 方法;如果給定一個 Unicode 字串,初始化程式將被傳遞給 fromunicode() 方法;否則,初始化程式的迭代器將被傳遞給 extend() 方法,以向陣列新增初始項。

陣列物件支援普通的序列操作,如索引、切片、拼接和重複。當使用切片賦值時,所賦的值必須是具有相同型別碼的陣列物件;在所有其他情況下,會引發 TypeError。陣列物件也實現了緩衝區介面,並且可以在任何支援 類位元組物件 的地方使用。

引發一個引數為 typecode, initializer審計事件 array.__new__

typecode

用於建立陣列的型別碼字元。

itemsize

內部表示中單個數組元素的位元組長度。

append(x)

將一個值為 *x* 的新項追加到陣列的末尾。

buffer_info()

返回一個元組 (address, length),給出當前記憶體地址和用於儲存陣列內容的緩衝區的元素個數。記憶體緩衝區的大小(以位元組為單位)可以透過 array.buffer_info()[1] * array.itemsize 計算。這在處理需要記憶體地址的低階(且本質上不安全)I/O 介面時偶爾有用,例如某些 ioctl() 操作。只要陣列存在並且沒有對其應用改變長度的操作,返回的數值就有效。

備註

當從用 C 或 C++ 編寫的程式碼中使用陣列物件時(這是有效利用此資訊的唯一方法),使用陣列物件支援的緩衝區介面更有意義。此方法為保持向後相容性而保留,在新程式碼中應避免使用。緩衝區介面在 緩衝協議 中有文件說明。

byteswap()

“位元組交換”陣列中的所有項。這隻支援大小為 1、2、4 或 8 位元組的值;對於其他型別的值,會引發 RuntimeError。當從具有不同位元組序的機器上寫入的檔案中讀取資料時,這很有用。

count(x)

返回 *x* 在陣列中出現的次數。

extend(iterable)

將 *iterable* 中的項追加到陣列的末尾。如果 *iterable* 是另一個數組,它必須具有*完全*相同的型別碼;否則,將引發 TypeError。如果 *iterable* 不是陣列,它必須是可迭代的,並且其元素必須是正確的型別才能追加到陣列中。

frombytes(buffer)

類位元組物件 中追加專案,將其內容解釋為機器值陣列(就好像它是使用 fromfile() 方法從檔案中讀取的一樣)。

在 3.2 版本加入: 為了清晰起見,fromstring() 已重新命名為 frombytes()

fromfile(f, n)

檔案物件 *f* 中讀取 *n* 個項(作為機器值),並將其追加到陣列的末尾。如果可用的項少於 *n* 個,則引發 EOFError,但可用的項仍會插入到陣列中。

fromlist(list)

從列表中追加項。這等效於 for x in list: a.append(x),不同之處在於,如果出現型別錯誤,陣列將保持不變。

fromunicode(s)

用給定的 Unicode 字串中的資料擴充套件此陣列。陣列的型別碼必須是 'u''w';否則會引發 ValueError。要將 Unicode 資料追加到其他型別的陣列中,請使用 array.frombytes(unicodestring.encode(enc))

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

返回最小的 *i*,使得 *i* 是 *x* 在陣列中首次出現的索引。可選引數 *start* 和 *stop* 可用於在陣列的子切片中搜索 *x*。如果未找到 *x*,則引發 ValueError

在 3.10 版本發生變更: 添加了可選的 *start* 和 *stop* 引數。

insert(i, x)

在位置 *i* 之前插入一個值為 *x* 的新項。負值被視為相對於陣列的末尾。

pop([i])

從陣列中移除索引為 *i* 的項並返回它。可選引數預設為 -1,因此預設情況下會移除並返回最後一個項。

remove(x)

從陣列中移除第一次出現的 *x*。

clear()

從陣列中移除所有元素。

在 3.13 版本加入。

reverse()

反轉陣列中項的順序。

tobytes()

將陣列轉換為機器值陣列,並返回位元組表示(與透過 tofile() 方法寫入檔案的位元組序列相同)。

在 3.2 版本加入: 為了清晰起見,tostring() 已重新命名為 tobytes()

tofile(f)

將所有項(作為機器值)寫入 檔案物件 *f*。

tolist()

將陣列轉換為具有相同項的普通列表。

tounicode()

將陣列轉換為 Unicode 字串。陣列的型別必須是 'u''w';否則會引發 ValueError。要從其他型別的陣列獲取 Unicode 字串,請使用 array.tobytes().decode(enc)

陣列物件的字串表示形式為 array(typecode, initializer)。如果陣列為空,則省略 *initializer*;否則,如果 *typecode* 是 'u''w',它是一個 Unicode 字串,否則它是一個數字列表。只要透過 from array import array 匯入了 array 類,就可以保證該字串表示能夠使用 eval() 轉換回具有相同型別和值的陣列。如果陣列包含相應的浮點值,則還必須定義變數 infnan。示例:

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

參見

模組 struct

異構二進位制資料的打包和解包。

NumPy

NumPy 包定義了另一種陣列型別。