Python中的“数组”主要指list和numpy.ndarray。list是内置的异构序列,支持多种数据类型和动态操作,适合小规模或非数值数据处理;而numpy.ndarray是同质多维数组,基于C实现,内存连续,支持高效数值运算和广播操作,适用于大规模科学计算。两者可通过np.array()和tolist()相互转换,核心区别在于数据类型一致性、性能和功能:list灵活但慢,ndarray高效专用于数值计算。

Python中,我们通常说的“数组”其实有两种主要形式:一种是内置的
list
numpy
ndarray
谈到Python中的“数组”操作,我们基本上是在围绕
list
numpy.ndarray
list
numpy
1. Python内置列表(list
list
立即学习“Python免费学习笔记(深入)”;
创建列表:
my_list = [1, 2, 3, 'hello', True] empty_list = [] another_list = list(range(5)) # [0, 1, 2, 3, 4]
访问元素: 使用索引(从0开始)和切片。
print(my_list[0]) # 1 print(my_list[-1]) # True (访问最后一个元素) print(my_list[1:4]) # [2, 3, 'hello'] (切片操作,不包含结束索引) print(my_list[::2]) # [1, 3, True] (步长为2)
修改元素:
my_list[0] = 100 print(my_list) # [100, 2, 3, 'hello', True]
添加元素:
my_list.append('world') # 在末尾添加
my_list.insert(1, 'new') # 在指定位置插入
print(my_list) # [100, 'new', 2, 3, 'hello', True, 'world']
list_a = [1, 2]
list_b = [3, 4]
list_c = list_a + list_b # 连接列表,生成新列表
print(list_c) # [1, 2, 3, 4]
list_a.extend(list_b) # 将list_b的元素添加到list_a末尾
print(list_a) # [1, 2, 3, 4]删除元素:
del my_list[1] # 根据索引删除 print(my_list) # [100, 2, 3, 'hello', True, 'world'] popped_element = my_list.pop() # 删除并返回最后一个元素 print(popped_element) # world print(my_list) # [100, 2, 3, 'hello', True] my_list.remove(100) # 删除第一个匹配的元素值 print(my_list) # [2, 3, 'hello', True]
其他常用操作:
len()
sort()
reverse()
count()
index()
2. NumPy ndarray
numpy
ndarray
安装NumPy: 如果没安装,先
pip install numpy
创建数组:
import numpy as np np_array_1d = np.array([1, 2, 3, 4, 5]) np_array_2d = np.array([[1, 2, 3], [4, 5, 6]]) print(np_array_1d) print(np_array_2d) # 常用创建函数 zeros_array = np.zeros((2, 3)) # 全0数组 ones_array = np.ones((3, 2)) # 全1数组 range_array = np.arange(0, 10, 2) # 类似range,但生成ndarray linspace_array = np.linspace(0, 1, 5) # 在指定区间内均匀生成N个点
访问元素与切片: 比列表更强大的多维切片。
print(np_array_2d[0, 1]) # 访问第一行第二列的元素:2 print(np_array_2d[:, 0]) # 访问所有行的第一列:[1 4] print(np_array_2d[0, :]) # 访问第一行的所有元素:[1 2 3] print(np_array_2d[0:2, 1:3]) # 切片:[[2 3], [5 6]] # 布尔索引 mask = np_array_1d > 3 print(np_array_1d[mask]) # [4 5]
元素级运算: 这是
ndarray
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # [5 7 9] print(a * 2) # [2 4 6] print(a * b) # 对应元素相乘:[4 10 18] print(np.sqrt(a)) # 逐元素求平方根
形状操作:
reshaped_array = np_array_1d.reshape((5, 1)) # 改变数组形状 print(reshaped_array) print(np_array_2d.T) # 转置
聚合函数:
print(np_array_1d.sum()) # 数组所有元素之和 print(np_array_2d.mean(axis=0)) # 沿列求平均值 print(np_array_2d.max()) # 最大值
这个问题问得非常好,因为这是初学者最容易混淆,也是最核心的一个点。说实话,我刚开始学Python的时候,也觉得“不都是存数据嘛,有啥区别?”但随着项目深入,你会发现它们的设计哲学和应用场景是截然不同的。
从我的经验来看,主要区别体现在以下几个方面:
数据类型:
list
ndarray
性能:
功能和操作:
append
insert
pop
sort
array1 + array2
list1 + list2
什么时候用哪个?
list
list
ndarray
numpy.ndarray
切片和索引是操作Python“数组”最基础也最强大的方式之一。掌握好它们,能让你在数据处理时事半功倍。我发现很多初学者对负数索引和多维数组的切片感到困惑,这里我们来详细聊聊。
1. Python列表(list
列表的索引是基于0的,这意味着第一个元素的索引是0,第二个是1,以此类推。
基本索引:
my_list = ['a', 'b', 'c', 'd', 'e'] print(my_list[0]) # 'a' print(my_list[2]) # 'c'
负数索引: 负数索引从列表末尾开始计数。
-1
-2
len(list) - 1
print(my_list[-1]) # 'e' print(my_list[-3]) # 'c'
切片([start:end:step]
start
end
step
start
end
step
print(my_list[1:4]) # ['b', 'c', 'd'] (从索引1到索引3) print(my_list[:3]) # ['a', 'b', 'c'] (从头到索引2) print(my_list[2:]) # ['c', 'd', 'e'] (从索引2到尾) print(my_list[:]) # ['a', 'b', 'c', 'd', 'e'] (复制整个列表) print(my_list[::2]) # ['a', 'c', 'e'] (每隔一个取一个) print(my_list[::-1]) # ['e', 'd', 'c', 'b', 'a'] (反转列表,非常酷)
2. NumPy数组(ndarray
NumPy数组的索引和切片在单维度上与列表类似,但在多维数组上则展现出其真正的威力。
一维数组: 和列表几乎一样。
import numpy as np arr_1d = np.array([10, 20, 30, 40, 50]) print(arr_1d[1]) # 20 print(arr_1d[-2]) # 40 print(arr_1d[1:4]) # [20 30 40] print(arr_1d[::-1]) # [50 40 30 20 10]
多维数组: 使用逗号分隔的索引来指定每个维度的位置。
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr_2d[0, 0]) # 1 (第一行第一列)
print(arr_2d[1, 2]) # 6 (第二行第三列)
print(arr_2d[0]) # [1 2 3] (访问第一行,等同于 arr_2d[0, :])多维切片:
# 获取第一行和第二行的所有列 print(arr_2d[0:2, :]) # 或者 arr_2d[:2, :] # 输出: # [[1 2 3] # [4 5 6]] # 获取所有行的第二列 print(arr_2d[:, 1]) # 输出: # [2 5 8] # 获取中间的子矩阵 print(arr_2d[1:3, 1:3]) # 输出: # [[5 6] # [8 9]]
步长切片:
arr_3d = np.arange(27).reshape((3, 3, 3)) print(arr_3d[::2, ::2, ::2]) # 在所有维度上每隔一个取一个
布尔索引: 这是NumPy一个非常强大的特性,你可以用一个布尔数组来选择元素。
arr = np.array([10, 20, 30, 40, 50]) mask = (arr > 25) & (arr < 45) # 创建一个布尔掩码 print(mask) # [False False True True False] print(arr[mask]) # [30 40] (只选择True对应的元素) # 修改满足条件的元素 arr[arr % 2 == 0] = 0 # 将所有偶数改为0 print(arr) # [ 0 20 0 40 0]
整数数组索引: 使用一个整数数组作为索引,可以按任意顺序选择元素。
arr = np.array([10, 20, 30, 40, 50]) indices = [0, 2, 4] print(arr[indices]) # [10 30 50]
掌握这些切片和索引的技巧,能让你在处理数据时更加灵活和高效,尤其是在数据分析和科学计算的场景中,这些操作是家常便饭。
在实际的数据处理流程中,我们经常需要在Python的
list
ndarray
1. Python列表转换为NumPy数组:
这是最常见的转换方向。NumPy提供了一个非常直观的函数
np.array()
import numpy as np
# 一维列表转一维NumPy数组
my_list_1d = [1, 2, 3, 4, 5]
np_array_1d = np.array(my_list_1d)
print(f"列表: {my_list_1d}, 类型: {type(my_list_1d)}")
print(f"NumPy数组: {np_array_1d}, 类型: {type(np_array_1d)}")
# 输出:
# 列表: [1, 2, 3, 4, 5], 类型: <class 'list'>
# NumPy数组: [1 2 3 4 5], 类型: <class 'numpy.ndarray'>
# 二维列表(列表的列表)转二维NumPy数组
my_list_2d = [[10, 20, 30], [40, 50, 60]]
np_array_2d = np.array(my_list_2d)
print(f"\n二维列表:\n{my_list_2d}")
print(f"二维NumPy数组:\n{np_array_2d}")
# 输出:
# 二维列表:
# [[10, 20, 30], [40, 50, 60]]
# 二维NumPy数组:
# [[10 20 30]
# [40 50 60]]需要注意的细节:
np.array()
mixed_list = [1, 2.5, 3] mixed_np_array = np.array(mixed_list) print(mixed_np_array) # [1. 2.5 3. ] print(mixed_np_array.dtype) # float64
np.array()
original_list = [1, 2, 3] arr = np.array(original_list) arr[0] = 99 print(original_list) # [1, 2, 3] (未改变) print(arr) # [99 2 3]
2. NumPy数组转换为Python列表:
NumPy数组对象有一个
tolist()
# 一维NumPy数组转一维列表 np_array_1d = np
以上就是Python中数组如何操作 Python中数组操作教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号