array — 高效的数值数组 — Python 文档

来自菜鸟教程
Python/docs/3.10/library/array
跳转至:导航、​搜索

array — 高效的数值数组


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

类型代码 C型 Python 类型 最小字节数 笔记
'b' 签名字符 整数 1
'B' 无符号的字符 整数 1
'u' wchar_t Unicode 字符 2 (1)
'h' 签名短 整数 2
'H' 无符号短 整数 2
'i' 有符号整数 整数 2
'I' 无符号整数 整数 2
'l' 长签 整数 4
'L' 无符号长 整数 4
'q' 签了很长很长 整数 8
'Q' 无符号长长 整数 8
'f' 漂浮 漂浮 4
'd' 双倍的 漂浮 8

笔记:

  1. 它可以是 16 位或 32 位,具体取决于平台。

    3.9 版更改:array('u') 现在使用 wchar_t 作为 C 类型,而不是不推荐使用的 Py_UNICODE。 此更改不会影响其行为,因为自 Python 3.3 以来 Py_UNICODEwchar_t 的别名。

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

该模块定义了以下类型:

class array.array(typecode[, initializer])

一个新数组,其项受 typecode 限制,并从可选的 initializer 值初始化,该值必须是一个列表、一个 bytes-like object 或可迭代的在适当类型的元素上。

如果给定一个列表或字符串,初始化器将传递给新数组的 fromlist()frombytes()fromunicode() 方法(见下文)将初始项添加到数组中。 否则,可迭代初始化器将传递给 extend() 方法。

array.typecodes
包含所有可用类型代码的字符串。

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

还支持以下数据项和方法:

array.typecode
用于创建数组的类型代码字符。
array.itemsize
内部表示中一个数组项的长度(以字节为单位)。
array.append(x)
将值为 x 的新项目追加到数组的末尾。
array.buffer_info()

返回一个元组 (address, length) 给出当前内存地址和用于保存数组内容的缓冲区元素的长度。 内存缓冲区的大小(以字节为单位)可以计算为 array.buffer_info()[1] * array.itemsize。 这在处理需要内存地址的低级(并且本质上不安全)I/O 接口时偶尔有用,例如某些 ioctl() 操作。 只要数组存在并且没有对其应用长度更改操作,返回的数字就是有效的。

笔记

当使用 C 或 C++ 编写的代码中的数组对象(有效利用此信息的唯一方法)时,使用数组对象支持的缓冲区接口更有意义。 维护此方法是为了向后兼容,应避免在新代码中使用。 缓冲区接口记录在 缓冲区协议 中。

array.byteswap()
“字节交换”数组的所有项目。 这仅支持大小为 1、2、4 或 8 个字节的值; 对于其他类型的值,会引发 RuntimeError。 从写入在具有不同字节顺序的机器上的文件中读取数据时,它很有用。
array.count(x)
返回数组中 x 的出现次数。
array.extend(iterable)
iterable 中的项目附加到数组的末尾。 如果 iterable 是另一个数组,它必须有 恰好 相同的类型代码; 如果没有,将引发 TypeError。 如果 iterable 不是数组,则它必须是可迭代的,并且其元素必须是要附加到数组的正确类型。
array.frombytes(s)

从字符串中附加项目,将字符串解释为机器值数组(就像使用 fromfile() 方法从文件中读取一样)。

3.2 版新功能:为了清晰起见,fromstring() 重命名为 frombytes()

array.fromfile(f, n)
文件对象 f 读取 n 项(作为机器值)并将它们附加到数组的末尾。 如果可用项目少于 n 个,则会引发 EOFError,但可用项目仍会插入到数组中。
array.fromlist(list)
从列表中附加项目。 这与 for x in list: a.append(x) 等效,只是如果存在类型错误,则数组不变。
array.fromunicode(s)
使用给定 unicode 字符串中的数据扩展此数组。 数组必须是'u'类型的数组; 否则会引发 ValueError。 使用 array.frombytes(unicodestring.encode(enc)) 将 Unicode 数据附加到某个其他类型的数组。
array.index(x[, start[, stop]])

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

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

array.insert(i, x)
在数组中位置 i 之前插入值为 x 的新项目。 负值被视为相对于数组的末尾。
array.pop([i])
从数组中删除索引为 i 的项目并返回它。 可选参数默认为 -1,因此默认情况下删除并返回最后一项。
array.remove(x)
从数组中删除第一次出现的 x
array.reverse()
反转数组中项目的顺序。
array.tobytes()

将数组转换为机器值数组并返回字节表示(与 tofile() 方法将写入文件的字节序列相同。)

3.2 版新功能:为了清晰起见,tostring() 重命名为 tobytes()

array.tofile(f)
将所有项目(作为机器值)写入 文件对象 f
array.tolist()
将数组转换为具有相同项的普通列表。
array.tounicode()
将数组转换为 unicode 字符串。 数组必须是'u'类型的数组; 否则会引发 ValueError。 使用 array.tobytes().decode(enc) 从其他类型的数组中获取 unicode 字符串。

当数组对象被打印或转换为字符串时,它表示为 array(typecode, initializer)。 如果数组为空,则省略 initializer,否则如果 typecode'u',则为字符串,否则为数字列表。 只要使用 from array import array。 例子:

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

也可以看看

模块 struct
异构二进制数据的打包和解包。
模块 xdrlib
一些远程过程调用系统中使用的外部数据表示 (XDR) 数据的打包和解包。
NumPy
NumPy 包定义了另一种数组类型。