整理:python的二维数组操作

本文介绍Python中正确初始化二维数组的方法,并解析为何某些常见方法会导致意外的结果。通过对比正确的实现方式与容易出错的方式,帮助读者理解如何避免在编程中遇到此类陷阱。


原文地址


Python中初始化一个5 x 3每项为0的数组,最好方法是:

multilist = [[0 for col in range(5)] for row in range(3)]

如果初始化一个二维数组时,是如下,怎会发生错误:

multi = [[0] * 5] * 3

因为[0] * 5是一个一维数组的对象,* 3的话只是把对象的引用复制了3次,比如,修改multi[0][0]:

multi = [[0] * 5] * 3
multi[0][0] = 'Love China'
print multi

输出的结果将是:

[['Love China', 0, 0, 0, 0], ['Love China', 0, 0, 0, 0], ['Love China', 0, 0,0, 0]]


我们修改了multi[0][0],却把我们的multi[1][0],multi[2][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个指向这个空列表元素的引用,修改任何一个元素都会改变整个列表:

所以初始化一个二维数组最好方法还是:

multilist = [[0 for col in range(5)] for row in range(3)]



 

 

ref:

http://www.cnblogs.com/coderzh/archive/2008/05/18/1201993.html

http://www.cnblogs.com/btchenguang/archive/2012/01/30/2332479.html

<think>嗯,用户想用Python二维数组转换成一维向量。我需要先回忆一下不同的方法。记得之前学过的,可能有多种方式,比如列表推导式、NumPy的flatten或者ravel函数,还有sum函数拼接之类的。首先,用户提到的二维数组,可能是普通的Python列表,也可能是NumPy数组。如果是普通列表的话,应该用列表推导式或者sum方法。如果是NumPy数组的话,可以用flatten或者ravel,这两个方法有什么区别呢?对了,flatten会返回副本,而ravel返回视图,修改会影响原数组。不过用户的问题里没有提到性能或内存的问题,可能只需要简单的方法。然后,引用里提到的那些方法,比如使用numpy的flatten,还有operator和itertools的方法。用户给的引用里有很多种方法,比如方法4是列表推导式,方法6是itertools.chain。应该把这些方法都整理一下,分清楚普通列表和NumPy数组的不同情况。用户的问题是如何实现,所以需要给出具体的代码示例。比如对于普通二维列表,可以用列表推导式:[元素for子列表in数组 for元素in子列表]。或者用sum(arr, []),不过这种方法效率可能不高,特别是对于大数组来说,但小数组没问题。另外,用户可能对NumPy的方法感兴趣,所以需要展示如何用flatten或者reshape。比如np.array(arr).flatten().tolist(),这样可以将NumPy数组转回列表。同时,也要注意是否需要保持顺序,比如按行展开还是按列,但一般情况是按行,所以默认方法应该没问题。 还要考虑是否需要处理多维数组,但用户的问题明确是二维转一维,所以不需要处理更高维度的情况。不过,可能有些方法可以通用,比如numpy的flatten不管多少维都能展平。 然后,检查用户提供的引用,比如引用2中提到了多种方法,包括numpy、sum、列表推导式、operator、itertools等。这些都需要涵盖到,可能每种方法都给出示例,并说明优缺点。比如列表推导式最直观,sum方法简洁但效率低,numpy方法适合处理大数据,但需要安装numpy库。最后,用户可能需要知道不同方法的适用场景,比如如果已经在用NumPy,那么flatten方法最合适;如果是纯Python环境,列表推导式或itertools.chain更好。还要注意原数组的类型,如果是NumPy数组,直接使用其方法更高效。总结一下,应该分两部分回答:普通列表的处理和NumPy数组的处理,每种情况给出几种方法,并附上代码示例。同时,指出不同方法的优缺点,帮助用户根据实际情况选择。</think>在Python中将二维数组展平为一维向量可通过多种方式实现,具体方法选择决于数据类型(普通列表或NumPy数组)和性能需求。以下是详细实现方法: --- ### **一、普通Python列表的展平方法** #### 1. **列表推导式** 通过双层循环遍历每个元素: ```python arr = [[1,2,3], [4,5], [6]] flattened = [item for sublist in arr for item in sublist] # 结果:[1,2,3,4,5,6] ``` #### 2. **`sum`函数拼接** 利用`sum`函数将子列表累加: ```python flattened = sum(arr, []) # 注意:此方法时间复杂度为O(n²),适用于小规模数据[^2] ``` #### 3. **`itertools.chain`** 使用标准库`itertools`高效拼接: ```python from itertools import chain flattened = list(chain.from_iterable(arr)) # 适用于大规模数据,时间复杂度为O(n)[^2] ``` --- ### **二、NumPy数组的展平方法** 若使用NumPy库,可高效处理多维数组: #### 1. **`flatten()`方法** 生成原数组的副本: ```python import numpy as np nd_arr = np.array([[1,2,3], [4,5,6]]) flattened = nd_arr.flatten().tolist() # 转换为普通列表 # 结果:[1,2,3,4,5,6][^1] ``` #### 2. **`ravel()`方法** 生成原数组的视图(修改视图会影响原数组): ```python flattened_view = nd_arr.ravel() ``` #### 3. **`reshape`函数** 直接改变数组形状: ```python flattened = nd_arr.reshape(-1).tolist() ``` --- ### **三、方法对比** | 方法 | 适用场景 | 时间复杂度 | 是否需要额外库 | |--------------------|-------------------|------------|----------------| | 列表推导式 | 普通列表小数据 | O(n) | 否 | | `itertools.chain` | 普通列表大数据 | O(n) | 是(标准库) | | NumPy的`flatten()` | 大规模数值计算 | O(n) | 是 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值