array — 数值的高效数组


此模块定义了一个对象类型,可以紧凑地表示基本值的数组:字符、整数、浮点数。 数组是序列类型,其行为与列表非常相似,只是存储在其中的对象的类型受到限制。 类型在对象创建时使用类型码指定,类型码是单个字符。 定义了以下类型代码

类型码

C 类型

Python 类型

最小字节大小

注释

'b'

signed char

int

1

'B'

unsigned char

int

1

'u'

wchar_t

Unicode 字符

2

(1)

'w'

Py_UCS4

Unicode 字符

4

'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。 此更改不会影响其行为,因为自 Python 3.3 以来 Py_UNICODEwchar_t 的别名。

    自 3.3 版本弃用,将在 3.16 版本中删除: 请迁移到 'w' 类型码。

值的实际表示形式由机器架构(严格来说,由 C 实现)确定。 实际大小可以通过 array.itemsize 属性访问。

该模块定义了以下项

array.typecodes

一个包含所有可用类型码的字符串。

该模块定义了以下类型

class array.array(typecode[, initializer])

一个新数组,其项受 typecode 限制,并从可选的 initializer 值初始化,该值必须是 bytesbytearray 对象、Unicode 字符串或适当类型的元素的可迭代对象。

如果给定 bytesbytearray 对象,则将初始化程序传递给新数组的 frombytes() 方法;如果给定 Unicode 字符串,则将初始化程序传递给 fromunicode() 方法;否则,将初始化程序的迭代器传递给 extend() 方法,以将初始项添加到数组中。

数组对象支持索引、切片、连接和乘法的普通序列操作。 当使用切片赋值时,分配的值必须是具有相同类型代码的数组对象;在所有其他情况下,将引发 TypeError。 数组对象还实现缓冲区接口,并且可以在支持类字节对象的任何地方使用。

使用参数 typecodeinitializer 引发 审计事件 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。 使用 array.frombytes(unicodestring.encode(enc)) 将 Unicode 数据追加到其他类型的数组。

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

返回最小的 i,使得 ix 在数组中第一次出现的索引。 可以指定可选参数 startstop 来在数组的子部分中搜索 x。 如果未找到 x,则引发 ValueError

3.10 版本更改: 添加了可选参数 startstop

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。使用 array.tobytes().decode(enc) 从其他类型的数组中获取 Unicode 字符串。

数组对象的字符串表示形式为 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 包定义了另一种数组类型。