1. 简介
在Python编程语言中,array模块提供了一种序列型的容器,即数组。它是由一组相同数据类型的元素构成,可以用于存储大量的数据,具有效率高、占用内存少等优点。这样的数组是一个像列表一样的对象,但仅包含类型相同的元素。如果需要在Python中使用数值数据,则可以使用数组模块。它也提供了非常方便的方法来对数组进行操作。
1.1 数组对象
array模块提供了一个名为array的类型,它表示数组对象。这个类型有以下属性:
typecode: 用来表示数组中元素的数据类型字符。
itemsize: 用来表示一个数组元素在内存中所占的字节数。
buffer_info(): 返回一个元组,包含两个值: 第一个是数组元素在内存中的起始位置,第二个是数组元素的个数。
append(x): 在数组的末尾添加x。
extend(iterable): 使用 iterable 中的所有元素来扩展数组。
count(x): 返回数组中 x 出现的次数。
index(x): 返回 x 在数组中的第一个位置。如果不存在,则引发 ValueError 。
insert(i, x): 在位置 i 插入一个元素 x 。
pop([i]): 删除并返回数组中的最后一个元素,或删除并返回位置为 i 的元素。
remove(x): 从数组中删除第一个值为 x 的元素。如果不存在,则引发 ValueError 。
reverse(): 反转数组中的顺序。
tobytes(): 将数组转换为字符串,其中每个元素用它的二进制形式进行表示。
tofile(f): 将数组写入文件对象 f 中,它必须是带有 write() 方法的文件对象。
tolist(): 将数组转换为列表。
2. 基本操作
2.1 创建数组
要创建一个数组,需要使用array.array()构造函数。这个构造函数有两个参数,第一个是数组元素的类型码,第二个是可选的初始数组值。例如,以下代码创建了一个由浮点数构成的数组:
import array
a = array.array('f', [1.0, 2.0, 3.0, 4.0])
print(a)
输出结果为:
array('f', [1.0, 2.0, 3.0, 4.0])
在该代码中,我们传递了浮点型的类型码 'f',并使用一个包含四个浮点数的列表来初始化数组 a 。你也可以使用形如 'i' 和 'd' 的类型码创建 int 和 double 类型的数组。 任何类型码均可在 Python 官方文档中找到。
2.2 访问数组元素
数组支持随机访问,因此可以像列表一样使用数组的索引来访问其中的元素。索引从 0 开始,并且可以是负数,表示从右侧开始反向索引。
import array
a = array.array('i', [1, 2, 3, 4, 5])
print(a[0])
print(a[-1])
输出结果为:
1
5
2.3 修改数组元素
你可以修改数组中的元素,就像修改列表中的元素一样。这可以通过直接给数组的索引赋值来完成:
import array
a = array.array('i', [1, 2, 3, 4, 5])
a[0] = 100
print(a)
输出结果为:
array('i', [100, 2, 3, 4, 5])
2.4 获取数组的长度
要获取数组中元素的数量,可以使用 len() 函数:
import array
a = array.array('i', [1, 2, 3, 4, 5])
print(len(a))
输出结果为:
5
3. 数组与列表的区别
3.1 数组的优点
使用数组而不是列表有以下优点:
效率高: 数组中的元素可以被紧密的打包在一起,这使得数组比列表更加紧凑和高效。这意味着可以在相同的内存占用情况下存储更多的数据。此外,由于数组中的数据类型通常是固定的,因此解释器可以使用更快的机器码来操作它们。
支持数值操作: 数组模块支持很多数值数据处理操作,例如计算和排序,而这些操作在列表中都需要使用显式的 for 循环来实现。
支持计算: 可以像 NumPy 数组一样在数组上进行科学计算。
3.2 数组的局限
使用数组而不是列表也有一些局限:
数组只能包含相同的数据类型: 在数组中只能包含一个数据类型,而在列表中可以包含不同类型的数据,这使得列表更加灵活。
数组不支持插入和删除操作: 在列表中添加、插入和删除元素是非常简单的。在数组中也可以实现这些操作,但是效率通常很低,因为它需要重建整个数组。
4. 数组的高级操作
4.1 数组与数学运算
与 NumPy 数组类似,数组也支持各种数学运算,包括加法、减法、乘法、除法等。这些运算通常是对数组中的每个元素都执行的。
import array
a = array.array('f', [1.0, 2.0, 3.0, 4.0])
b = array.array('f', [5.0, 6.0, 7.0, 8.0])
c = array.array('f') #创建一个新的空数组
for i in range(len(a)):
c.append(a[i] + b[i])
print(c)
输出结果为:
array('f', [6.0, 8.0, 10.0, 12.0])
4.2 数组排序
数组的元素可以使用sorted()函数进行排序。 sorted() 函数返回一个新的已排序的列表,而不会修改原始数组。
import array
a = array.array('i', [3, 2, 4, 1, 5])
b = sorted(a)
print(a) # 输出原始数组
print(b) # 输出已排序的列表
输出结果为:
array('i', [3, 2, 4, 1, 5])
[1, 2, 3, 4, 5]
4.3 数组索引切片
与列表类似,数组也支持索引和切片操作。这些操作允许获取数组的单个元素或一个子集。数组的切片也是一个数组,可用于分离特定的元素或对它们进行操作。
import array
a = array.array('i', [1, 2, 3, 4, 5])
print(a[1:3]) # 输出索引从 1 到 2 的元素
输出结果为:
array('i', [2, 3])
4.4 数组逆序
数组中的元素也可以反转,即从尾到头排列。这可以使用数组的reverse()方法完成。
import array
a = array.array('i', [1, 2, 3, 4, 5])
a.reverse()
print(a)
输出结果为:
array('i', [5, 4, 3, 2, 1])
4.5 数组的拷贝
数组也支持拷贝,以保留数组的内容并允许在应用的整个生命周期内使用它。有两种基本的拷贝方式:浅拷贝和深拷贝。
4.5.1 浅拷贝
浅拷贝是一种备份数组的方法,只拷贝数组中元素的引用,而不是数组的实际数据。因此,如果更改了一个元素,原始数组和浅拷贝数组都会受到影响。
import array
a = array.array('i', [1, 2, 3, 4, 5])
b = a #浅拷贝
a[0] = 100
print(a)
print(b)
输出结果为:
array('i', [100, 2, 3, 4, 5])
array('i', [100, 2, 3, 4, 5])
4.5.2 深拷贝
在深拷贝中,数组和其元素的所有内容都被复制,包括元素的值和内存地址。这意味着原始数组和拷贝数组可以独立地修改而不会相互影响。
import array
import copy #需要导入 copy 模块
a = array.array('i', [1, 2, 3, 4, 5])
b = copy.deepcopy(a) #深拷贝
a[0] = 100
print(a)
print(b)
输出结果为:
array('i', [100, 2, 3, 4, 5])
array('i', [1, 2, 3, 4, 5])
5. 总结
在Python中,数组是一个非常有用的数据结构。使用数组而不是列表可以提高代码的效率,特别是当需要存储大量的数据时。数组对于数值计算和科学计算非常有用。我们可以使用数组进行各种数学运算,例如加、减、乘、除、排序等。在此基础上,我们还可以执行数组的切片和索引操作,以及复制和反转等高级操作。