python的二维数组操作

本文探讨了Python中创建二维数组的一种常见错误方法及其原因,并给出正确的创建方式,避免浅拷贝导致的数据同步修改问题。
原文地址为: python的二维数组操作

需要在程序中使用二维数组,网上找到一种这样的用法:

#创建一个宽度为3,高度为4的数组
#[[0,0,0],
# [0,0,0],
# [0,0,0],
# [0,0,0]]
myList = [[0] * 3] * 4

但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成

[[0,1,0],

[0,1,0],

[0,1,0],

[0,1,0]]

为什么...一时搞不懂,后面翻阅The Python Standard Library 找到答案

list * n—>n shallow copies of list concatenated, n个list的浅拷贝的连接

例:

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

[[]]是一个含有一个空列表元素的列表,所以[[]]*3表示3个指向这个空列表元素的引用,修改任何

一个元素都会改变整个列表:

所以需要用另外一种方式进行创建多维数组,以免浅拷贝:

>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]

之前的二维数组创建方式为:

myList = [([0] * 3) for i in range(4)]

转载请注明本文地址: python的二维数组操作
<think> 首先,用户的问题是:“我想查找Python二维数组基本操作的相关内容 请问Python二维数组的基本操作”。用户正在询问Python二维数组的基本操作。 用户提到了引用:[1], [2], [3], [4],这些是系统提供的引用,我应该参考它们。系统指令说:“请尽可能多的参考用户上一次的问题和你的回答”,但用户上一次的问题就是这个,所以我会参考这些引用。 让我回顾一下引用的内容: - 引用[1]:展示了使用NumPy创建二维数组并进行算术运算、通用函数和聚集函数。包括创建数组、加法、乘法、除法、平方根、最大、总和、平均等。 - 引用[2]:讨论了二维数组的初始化问题,特别是使用`[[0] * n] * m`时可能出现的享引用问题,导致所有行都引用同一个列表。 - 引用[3]:解释了二维数组切片规则,包括如何切片行和列。 - 引用[4]:是关于使用Pandas的DataFrame处理二维数组,包括生成DataFrame和查看索引等。 用户的问题焦点是“Python二维数组基本操作”,所以我需要覆盖基本操作。由于引用中提到了NumPy和Pandas,我应该包括这些,但核心是Python原生列表和NumPy数组,因为用户提到“二维数组”。 在Python中,二维数组通常表示为列表的列表(例如,`[[1, 2], [3, 4]]`),或者使用NumPy数组(`numpy.array`)。Pandas DataFrame是用于表格数据的更高级结构。 我的回答应该结构清晰,逐步解决问题。系统指令要求: - 行内数学表达式用$...$(例如,变量) - 独立公式用$$...$$ - LaTeX语法正确 - 使用中文回答 - 生成相关问题 - 引用段落末尾添加引用标识,如[^1] 最后,在回答结束时添加相关问题。 结构化回答: 1. **介绍**:简要解释Python二维数组是什么。 2. **创建二维数组**:包括使用原生Python列表和NumPy数组。 3. **基本操作**:参考引用,涵盖算术运算、索引、切片、修改元素、聚集函数等。 - 算术运算:如引用[1]中的加减乘除。 - 索引和切片:如引用[3]。 - 聚集函数:如最大、最小、总和、平均,如引用[1]。 - 注意引用[2]中的初始化陷阱。 - 如果相关,提及Pandas DataFrame,但用户焦点是基本操作,所以可能简略。 4. **示例**:提供代码示例。系统指令有示例使用代码块,我应该类似添加代码块。 5. **总结**。 6. **相关问题**:在结束时生成相关问题。 确保语言中文。 关键点来自引用: - 来自[1]:创建数组,算术运算(+5, *5, /10, array addition),通用函数(sqrt, square),聚集函数(max, sum, mean, argmin)。 - 来自[2]:正确初始化二维数组以避免引用问题。建议使用列表推导:`[[0]*n for _ in range(m)]`。 - 来自[3]:切片规则,例如`scores[:,0]`表示所有行的第0列。 - 来自[4]:Pandas DataFrame,但可能不是核心需求,所以简要提到或忽略。 用户说“上述引用仅供参考”,所以我应该以用户问题为导向,但参考这些内容。 回答结构: - **创建二维数组** - **访问和修改元素** - **算术运算** - **切片操作** - **聚集函数**(如求和、平均) - **常见陷阱**(如初始化问题) 添加代码示例。 </think> ### Python二维数组的基本操作Python中,二维数组通常表示为列表的列表(例如,`[[1, 2], [3, 4]]`)或使用NumPy库中的`numpy.array`对象(适用于数计算)。基本操作包括创建、访问元素、修改、切片、算术运算和聚集函数计算等。下面我将逐步解释这些操作,参考您的引用内容并结合Python标准库和相关库(如NumPy)进行说明。操作基于原生Python列表和NumPy数组两种形式,因为NumPy在科学计算中更高效[^1][^3]。 #### 1. **创建二维数组** - **原生Python列表**:使用嵌套列表初始化。但要注意,错误的方式可能导致子列表享引用(如引用[2]所示),应使用列表推导式避免。 ```python # 正确方式:创建5行7列的全0数组 rows, cols = 5, 7 array_2d = [[0] * cols for _ in range(rows)] # 避免引用问题[^2] print(array_2d) # 输出: [[0, 0, ..., 0], [0, 0, ..., 0], ...] ``` - **使用NumPy**:引用[1]展示了`numpy.array`的创建方法,更适用于数运算。 ```python import numpy as np scores = np.array([[70, 85, 77], [60, 64, 80]]) # 创建2行3列的数组 print(scores) ``` #### 2. **访问和修改元素** - **访问元素**:通过行索引和列索引获取。索引从0开始。 ```python # 原生列表 array_2d = [[1, 2], [3, 4]] print(array_2d[0][1]) # 输出: 2 (第一行第二列) # NumPy数组 scores = np.array([[70, 85], [60, 64]]) print(scores[0, 1]) # 输出: 85 ``` - **修改元素**:直接赋更新。 ```python # 修改原生列表 array_2d[0][1] = 10 print(array_2d) # 输出: [[1, 10], [3, 4]] # 修改NumPy数组 scores[0, 1] = 90 print(scores) # 输出: [[70, 90], [60, 64]] ``` #### 3. **切片操作** 切片用于提取子数组。引用[3]详细解释了规则:冒号前的部分操作行维度,冒号后的部分操作列维度。 - **原生Python列表**:使用列表切片,但需逐行操作。 ```python array_2d = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 提取第0到第1行(不包括第2行),和第1列之后的所有列 sub_array = [row[1:] for row in array_2d[0:2]] # 手动切片行 print(sub_array) # 输出: [[2, 3], [5, 6]] ``` - **NumPy数组**:支持高效的多维切片。 ```python import numpy as np t = np.arange(1, 10).reshape(3, 3) # 创建3x3数组[[1,2,3],[4,5,6],[7,8,9]] # 切片:所有行,第1列到结束 (维度0操作行,维度1操作列)[^3] print(t[:, 1:]) # 输出: [[2, 3], [5, 6], [8, 9]] ``` #### 4. **算术运算** 包括元素间加减乘除。NumPy支持向量化运算(高效),而原生列表需遍历操作。 - **原生Python列表**:需循环实现。 ```python array1 = [[1, 2], [3, 4]] array2 = [[5, 6], [7, 8]] # 加法示例(逐元素) result = [[array1[i][j] + array2[i][j] for j in range(len(array1[0]))] for i in range(len(array1))] print(result) # 输出: [[6, 8], [10, 12]] ``` - **NumPy数组**:引用[1]展示了直接运算。 ```python scores = np.array([[70, 85], [60, 64]]) # 所有元素加5 print(scores + 5) # 输出: [[75, 90], [65, 69]] # 元素乘以标量 print(scores * 0.3) # 输出: [[21.0, 25.5], [18.0, 19.2]] # 数组间加法 t = np.array([[1, 2], [3, 4]]) print(scores + t) # 输出: [[71, 87], [63, 68]] ``` #### 5. **聚集函数** 计算统计如最大、总和、平均等。NumPy提供内置函数,原生列表需手动实现。 - **原生Python列表**:使用内置函数如`max()`或`sum()`,但需嵌套循环。 ```python array_2d = [[1, 2], [3, 4]] # 计算所有元素的最大 max_val = max(max(row) for row in array_2d) print(max_val) # 输出: 4 # 计算每行的总和 row_sums = [sum(row) for row in array_2d] print(row_sums) # 输出: [3, 7] ``` - **NumPy数组**:引用[1]演示了高效聚集函数,支持沿轴计算。 ```python scores = np.array([[70, 85], [60, 64], [90, 93]]) # 全局最大 print(np.max(scores)) # 输出: 93 # 每列的平均 (axis=0表示列方向)[^1] print(scores.mean(axis=0)) # 输出: [73.333, 80.666] # 每行的总和 (axis=1表示行方向) print(scores.sum(axis=1)) # 输出: [155, 124, 183] # 最小索引(列方向) print(scores.argmin(axis=0)) # 输出: [1, 1] (表示第一列最小在行索引1,第二列在行索引1) ``` #### 6. **常见陷阱和最佳实践** - **初始化问题**:引用[2]强调,使用`[[0]*n]*m`会导致子列表享引用。改用列表推导式`[[0]*n for _ in range(m)]`避免[^2]。 - **高级操作**:对于表格数据,可考虑Pandas DataFrame(如引用[4]),它提供更多功能(如列名操作),但原生操作更基础。 - **性能建议**:数密集运算优先选用NumPy,其向量化操作比循环快10-100倍[^1][^3]。 总结:Python二维数组的基本操作包括创建、访问、切片、运算和聚集函数。原生列表适用于简单场景,而NumPy在性能和功能上更强大。实际应用中,根据需求选择合适方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值