8.6. array — 高效的数值数组 — Python 文档
8.6. 大批 — 高效的数值数组
该模块定义了一个对象类型,它可以紧凑地表示一组基本值:字符、整数、浮点数。 数组是序列类型,其行为与列表非常相似,只是其中存储的对象类型受到限制。 类型是在对象创建时使用 类型代码 指定的,该代码是单个字符。 定义了以下类型代码:
类型代码 | C型 | Python 类型 | 最小字节数 |
---|---|---|---|
'c'
|
字符 | 特点 | 1 |
'b'
|
签名字符 | 整数 | 1 |
'B'
|
无符号字符 | 整数 | 1 |
'u'
|
Py_UNICODE | Unicode 字符 | 2(见注) |
'h'
|
签名短 | 整数 | 2 |
'H'
|
无符号短 | 整数 | 2 |
'i'
|
有符号整数 | 整数 | 2 |
'I'
|
无符号整数 | 长 | 2 |
'l'
|
长签 | 整数 | 4 |
'L'
|
无符号长 | 长 | 4 |
'f'
|
漂浮 | 漂浮 | 4 |
'd'
|
双倍的 | 漂浮 | 8 |
笔记
'u'
类型代码对应于 Python 的 unicode 字符。 在窄 Unicode 构建中,这是 2 字节,在宽构建中,这是 4 字节。
值的实际表示由机器架构决定(严格来说,由 C 实现决定)。 可以通过 itemsize
属性访问实际大小。 为 'L'
和 'I'
项存储的值在检索时将表示为 Python 长整数,因为 Python 的纯整数类型不能表示 C 的所有无符号(长)整数范围。
该模块定义了以下类型:
- class array.array(typecode[, initializer])
一个新数组,其项受 typecode 限制,并从可选的 initializer 值初始化,该值必须是列表、字符串或可迭代适当类型的元素。
2.4 版更改: 以前,只接受列表或字符串。
如果给定一个列表或字符串,初始化器将传递给新数组的 fromlist()、fromstring() 或 fromunicode() 方法(见下文)将初始项添加到数组中。 否则,可迭代初始化器将传递给 extend() 方法。
- array.ArrayType
- array 的过时别名。
数组对象支持索引、切片、连接和乘法的普通序列操作。 使用切片赋值时,赋值必须是一个类型码相同的数组对象; 在所有其他情况下,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 不是数组,则它必须是可迭代的,并且其元素必须是要附加到数组的正确类型。2.4 版本变化: 以前,参数只能是另一个数组。
- array.fromfile(f, n)
- 从文件对象 f 中读取 n 项(作为机器值)并将它们附加到数组的末尾。 如果可用的项目少于 n 个,则会引发
EOFError
,但可用的项目仍会插入到数组中。 f 必须是真正的内置文件对象; 其他带有 read() 方法的东西不会做。
- array.fromlist(list)
- 从列表中附加项目。 这与
for x in list: a.append(x)
等效,只是如果存在类型错误,则数组不变。
- array.fromstring(s)
- 从字符串中附加项目,将字符串解释为机器值数组(就像使用 fromfile() 方法从文件中读取一样)。
- array.fromunicode(s)
- 使用给定 unicode 字符串中的数据扩展此数组。 数组必须是
'u'
类型的数组; 否则会引发ValueError
。 使用array.fromstring(unicodestring.encode(enc))
将 Unicode 数据附加到某个其他类型的数组。
- array.index(x)
- 返回最小的 i,使得 i 是数组中第一次出现 x 的索引。
- array.insert(i, x)
- 在数组中位置 i 之前插入值为 x 的新项目。 负值被视为相对于数组的末尾。
- array.pop([i])
- 从数组中删除索引为 i 的项目并返回它。 可选参数默认为
-1
,因此默认情况下删除并返回最后一项。
- array.read(f, n)
自 1.5.1 版起已弃用: 使用 fromfile() 方法。
从文件对象 f 中读取 n 项(作为机器值)并将它们附加到数组的末尾。 如果可用的项目少于 n 个,则会引发
EOFError
,但可用的项目仍会插入到数组中。 f 必须是真正的内置文件对象; 其他带有 read() 方法的东西不会做。
- array.remove(x)
- 从数组中删除第一次出现的 x。
- array.reverse()
- 反转数组中项目的顺序。
- array.tofile(f)
- 将所有项目(作为机器值)写入文件对象 f。
- array.tolist()
- 将数组转换为具有相同项的普通列表。
- array.tostring()
- 将数组转换为机器值数组并返回字符串表示(与 tofile() 方法将写入文件的字节序列相同。)
- array.tounicode()
- 将数组转换为 unicode 字符串。 数组必须是
'u'
类型的数组; 否则会引发ValueError
。 使用array.tostring().decode(enc)
从其他类型的数组中获取 unicode 字符串。
- array.write(f)
自 1.5.1 版起已弃用: 使用 tofile() 方法。
将所有项目(作为机器值)写入文件对象 f。
当数组对象被打印或转换为字符串时,它表示为 array(typecode, initializer)
。 如果数组为空,则省略 initializer,否则如果 typecode 为 'c'
,则为字符串,否则为数字列表。 只要使用 from array import array
。 例子:
array('l')
array('c', 'hello world')
array('u', u'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14])
也可以看看
- 模块 struct
- 异构二进制数据的打包和解包。
- 模块 xdrlib
- 一些远程过程调用系统中使用的外部数据表示 (XDR) 数据的打包和解包。
- 数值 Python 文档
- Numeric Python 扩展 (NumPy) 定义了另一种数组类型; 有关数值 Python 的更多信息,请参见 http://www.numpy.org/。