话说,最近在捣鼓数据分析,二维数组那可是个绕不开的坎儿。刚开始学Python的时候,我就栽在这个上面了。哎,谁还没个踩坑的经历呢?今天我就好好跟大家唠唠,Python里面怎么定义这玩意儿,保证让你不再迷路。
最直接,也最容易想到的,就是用列表推导式。这东西,简直是Python的瑞士军刀,啥都能搞定。就像这样:
python
rows = 3
cols = 4
matrix = [[0 for _ in range(cols)] for _ in range(rows)]
print(matrix) # 输出: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
这段代码,一眼看过去,可能有点懵。别急,咱们拆开揉碎了说。rows = 3
和 cols = 4
定义了数组的行数和列数,这没啥好说的。关键是中间那行,matrix = [[0 for _ in range(cols)] for _ in range(rows)]
。
它其实就是嵌套的列表推导式。里面的 [0 for _ in range(cols)]
负责生成每一行,相当于一个长度为 cols
的列表,里面全是 0
。外面的 [... for _ in range(rows)]
负责把这些行重复 rows
次,最终组成一个二维数组。
这种方法,简单粗暴,但是有个坑!啥坑?就是如果你想修改某个元素的值,可能会出现意想不到的结果。比如:
python
matrix = [[0] * 3] * 4
matrix[0][0] = 1
print(matrix) # 输出: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
看到了吧?我只想改 matrix[0][0]
,结果所有行的第一个元素都被改了!这叫做“浅拷贝”。因为 [[0] * 3] * 4
实际上只是创建了4个指向同一个列表的引用。所以修改一个,相当于修改了全部。要解决这个问题,还是得用列表推导式,确保每个列表都是独立的。
除了列表推导式,我们还可以用NumPy库。这玩意儿,是Python数据分析的标配。定义二维数组,简直不要太方便。
“`python
import numpy as np
matrix = np.zeros((3, 4))
print(matrix)
“`
NumPy的 zeros()
函数,可以快速创建一个指定形状的数组,里面的元素都是0。 形状参数是一个元组 (3, 4)
,表示3行4列。 NumPy的优势在于,它底层是用C语言实现的,运算速度非常快。而且,NumPy提供了大量的数组操作函数,比如矩阵乘法、转置、求逆等等,用起来简直不要太爽。
如果你需要一个初始值不是0的数组,可以用 np.full()
函数:
python
matrix = np.full((3, 4), 7)
print(matrix) # 输出: [[7. 7. 7. 7.] [7. 7. 7. 7.] [7. 7. 7. 7.]]
np.full((3, 4), 7)
表示创建一个3行4列的数组,里面的元素都是7。
还有一种情况,就是你的数据已经存在了,比如从文件读取的,或者从数据库查询出来的。这时候,你可以直接把这些数据转换成二维数组。
python
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix = np.array(data)
print(matrix)
np.array()
函数可以把列表或者元组转换成NumPy数组。
说到这里,我想起我刚工作那会儿,有个同事写了个爬虫,爬取了一堆数据,存到了CSV文件里。他想用Python分析这些数据,但是不知道怎么把CSV文件读进来,变成二维数组。 我当时就给他推荐了NumPy的 loadtxt()
函数。
“`python
import numpy as np
假设data.csv文件内容为:
1,2,3
4,5,6
7,8,9
matrix = np.loadtxt(“data.csv”, delimiter=”,”)
print(matrix)
“`
np.loadtxt("data.csv", delimiter=",")
可以把CSV文件读进来,自动转换成NumPy数组。 delimiter=","
表示CSV文件里面的分隔符是逗号。
当然,如果你不想用NumPy,也可以用Python自带的csv模块来读取CSV文件。
“`python
import csv
with open(‘data.csv’, ‘r’) as csvfile:
reader = csv.reader(csvfile)
matrix = list(reader)
print(matrix)
“`
这段代码,首先用 open()
函数打开CSV文件,然后用 csv.reader()
函数创建一个reader对象。 reader
对象可以逐行读取CSV文件的内容。 最后,用 list()
函数把 reader
对象转换成列表,就得到了二维数组。 这种方法,读取到的数据都是字符串类型的。如果需要数值类型,还需要手动转换。
总结一下,Python定义二维数组的方法有很多种:可以用列表推导式,可以用NumPy,可以用csv模块。选择哪种方法,取决于你的具体需求。 如果你需要高性能的数值计算,NumPy是首选。 如果你只是需要简单的数据存储,列表推导式就足够了。 如果你需要读取CSV文件,可以用NumPy的 loadtxt()
函数或者csv模块。 记住,选择最适合你的工具,才能事半功倍。
评论(0)