8.7. array — 高效的数值数组

该模块定义了一个对象类型,可以紧凑地表示一个基本值的数组:字符,整数,浮点数。数组是序列类型,并且表现得非常像列表,除了存储在它们中的对象的类型是受约束的。类型在对象创建时使用类型代码指定,该类型代码是单个字符。定义了以下类型代码:

类型代码C类型Python类型最小大小(以字节为单位)笔记
'b'signed charINT1
'B'unsigned charINT1
'u'Py_UNICODEUnicode字符2(1)
'h'signed shortINT2
'H'unsigned shortINT2
'i'签名intINT2
'I'无符号整数INT2
'l'signed longINT4
'L'无符号长整数INT4
'q'signed long longINT8(2)
'q'无符号long longINT8(2)
'f'floatfloat4
'd'doublefloat8

笔记:

  1. 'u'类型代码对应于Python的过时unicode字符(Py_UNICODE,即wchar_t)。根据平台,它可以是16位或32位。

    'u'将与Py_UNICODE API的其余部分一起删除。

    从版本3.3开始弃用,将在4.0版中删除。

  2. The 'q' and 'Q' type codes are available only if the platform C compiler used to build Python supports C long long, or, on Windows, __int64.

    版本3.3中的新功能。

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

模块定义以下类型:

class array.array(typecode[, initializer])

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

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

array.typecodes

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

数组对象支持索引,切片,级联和乘法的常规顺序操作。当使用切片分配时,分配的值必须是具有相同类型代码的数组对象;在所有其他情况下,会引发TypeError数组对象还实现缓冲区接口,并且可以在支持bytes-like objects的任何位置使用。

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

array.typecode

用于创建数组的类型代码字符。

array.itemsize

内部表示中一个数组项的字节长度。

array.append(x)

将值为x的新项目附加到数组的末尾。

array.buffer_info()

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

注意

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

array.byteswap()

“Byteswap”数组的所有项。这仅适用于大小为1,2,4或8个字节的值;对于其他类型的值,会引发RuntimeError在从具有不同字节顺序的机器上写入的文件读取数据时非常有用。

array.count(x)

返回数组中 x 的次数。

array.extend(iterable)

可迭代对象的项目附加到数组的末尾。如果iterable是另一个数组,它必须具有完全相同的类型代码;否则,则会引发TypeError异常。如果iterable不是一个数组,它必须是可迭代的,并且其元素必须是要附加到数组的正确类型。

array.frombytes(s)

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

版本3.2中的新功能: fromstring()重命名为frombytes()

array.fromfile(f, n)

file object f读取n项目(作为机器值),并将它们附加到数组的末尾。如果少于n个项目可用,则会引发EOFError,但可用的项目仍会插入数组。f必须是真正的内建文件对象;其他与read()方法不会做。

array.fromlist(list)

从列表中追加项目。这等效于 t>> 列表中的: t> x a.append / t5>,但是如果存在类型错误,则数组不更改。

array.fromstring()

frombytes()的已弃用别名。

array.fromunicode(s)

使用给定的unicode字符串中的数据扩展此数组。数组必须是类型'u'数组;否则会引发ValueError使用array.frombytes(unicodestring.encode(enc))将Unicode数据附加到某个其他类型的数组。

array.index(x)

返回最小的i,使得i是数组中第一次出现的x的索引。

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)

将所有项目(作为机器值)写入file object f

array.tolist()

将数组转换为具有相同项目的普通列表。

array.tostring()

tobytes()的已弃用别名。

array.tounicode()

将数组转换为unicode字符串。数组必须是类型'u'数组;否则会引发ValueError使用array.tobytes().decode(enc)从某个其他类型的数组获取unicode字符串。

当数组对象被打印或转换为字符串时,它被表示为array(typecode, initializer)如果数组为空,则省略初始化器,否则如果类型代码'u',则为字符串,否则为列表数字。只要array()函数使用from array import array被导入,使用eval(),该字符串就保证能够被转换回一个相同类型和值的数组。例子:

array('l')
array('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/