Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Python中数组如何操作 Python中数组操作教程_创想鸟

Python中数组如何操作 Python中数组操作教程

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

python中数组如何操作 python中数组操作教程

Python中,我们通常说的“数组”其实有两种主要形式:一种是内置的

list

(列表),它非常灵活,能存放各种类型的数据;另一种是

numpy

库提供的

ndarray

,这才是真正意义上的高性能、同质性数组,尤其适合数值计算和科学计算。理解这两种“数组”的差异和各自的操作方式,是高效编写Python代码的关键。

解决方案

谈到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])      # 1print(my_list[-1])     # True (访问最后一个元素)print(my_list[1:4])    # [2, 3, 'hello'] (切片操作,不包含结束索引)print(my_list[::2])    # [1, 3, True] (步长为2)

修改元素:

my_list[0] = 100print(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)        # worldprint(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

是Python进行科学计算的核心库,它的

ndarray

对象是多维同质数组,专为高效数值运算设计。

安装NumPy: 如果没安装,先

pip install numpy

创建数组:

import numpy as npnp_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,但生成ndarraylinspace_array = np.linspace(0, 1, 5) # 在指定区间内均匀生成N个点

访问元素与切片: 比列表更强大的多维切片。

print(np_array_2d[0, 1])       # 访问第一行第二列的元素:2print(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 > 3print(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列表与NumPy数组有什么区别?

这个问题问得非常好,因为这是初学者最容易混淆,也是最核心的一个点。说实话,我刚开始学Python的时候,也觉得“不都是存数据嘛,有啥区别?”但随着项目深入,你会发现它们的设计哲学和应用场景是截然不同的。

从我的经验来看,主要区别体现在以下几个方面:

数据类型:

Python列表(

list

): 是异构的,这意味着一个列表中可以同时存储整数、浮点数、字符串、甚至其他列表或对象。这种灵活性很强,但代价是内存占用和访问效率。NumPy数组(

ndarray

): 是同构的,即所有元素必须是相同的数据类型(例如,全部是整数,或者全部是浮点数)。如果你尝试放入不同类型的数据,NumPy会尝试向上转型以保持同质性。这种特性让NumPy能将数据紧密地存储在内存中,从而实现高效的数值运算。

性能:

Python列表: 由于其异构性和动态大小的特性,列表中的每个元素实际上都存储为一个指向实际数据对象的指针。这意味着当你遍历列表或进行大量数值运算时,Python需要处理这些指针,导致性能开销较大,尤其是在处理大型数据集时。NumPy数组: 底层是用C语言实现的,数据是连续存储在内存中的。这使得NumPy在进行大规模数值运算时,可以利用CPU的SIMD(单指令多数据)指令集,并避免Python的解释器开销,因此速度非常快。对于科学计算、机器学习等场景,NumPy是不可或缺的。

功能和操作:

Python列表: 提供了非常通用的序列操作,比如

append

insert

pop

sort

等,更侧重于数据的组织和管理。NumPy数组: 提供了极其丰富的数学函数和操作,可以直接对整个数组进行元素级的算术运算(如加减乘除)、线性代数、傅里叶变换、随机数生成等。它的设计目标就是为了高效地处理数值数据。比如,两个NumPy数组相加,

array1 + array2

会直接进行对应元素的相加,而两个列表相加

list1 + list2

则是拼接操作。

什么时候用哪个?

list

当你需要存储不同类型的数据,或者数据结构经常变化(频繁增删),或者数据量不大且不涉及大量数值计算时,

list

是更简单、更直观的选择。

ndarray

当你处理的是大型数值数据集,需要进行高效的数学运算、统计分析,或者进行机器学习、深度学习等任务时,

numpy.ndarray

是绝对的首选。它的性能优势是列表无法比拟的。

Python数组的切片和索引技巧有哪些?

切片和索引是操作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

是步长,默认为1。

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 nparr_1d = np.array([10, 20, 30, 40, 50])print(arr_1d[1])    # 20print(arr_1d[-2])   # 40print(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          # 将所有偶数改为0print(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中如何将列表转换为NumPy数组,反之亦然?

在实际的数据处理流程中,我们经常需要在Python的

list

和NumPy的

ndarray

之间进行转换。这通常发生在数据从外部源(比如CSV文件、数据库查询结果)加载进来时,它们可能最初以列表的形式存在,但为了进行高效的数值计算,我们需要将它们转换为NumPy数组。反过来,当你完成了NumPy数组的计算,可能需要将结果以列表的形式输出,或者与不接受NumPy数组的库进行交互。

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], 类型: # NumPy数组: [1 2 3 4 5], 类型: # 二维列表(列表的列表)转二维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()

会尝试推断列表元素的统一数据类型。如果列表包含混合类型,NumPy会向上转型以保持同质性。例如,如果列表中有整数和浮点数,它会全部转为浮点数。

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()

会创建一个原始列表的深拷贝,这意味着修改NumPy数组不会影响原始列表,反之亦然。这通常是你想要的行为。

original_list = [1, 2, 3]arr = np.array(original_list)arr[0] = 99print(original_list) # [1, 2, 3] (未改变)print(arr)           # [99  2  3]

2. NumPy数组转换为Python列表:

NumPy数组对象有一个

tolist()

方法,可以方便地将其转换为Python列表。对于多维数组,它会生成一个嵌套的列表。

# 一维NumPy数组转一维列表np_array_1d = np

以上就是Python中数组如何操作 Python中数组操作教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1368997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python中模块导入方法详解 Python中import使用指南
上一篇 2025年12月14日 09:15:48
Python怎么使用Pandas库_Pandas数据处理入门指南
下一篇 2025年12月14日 09:16:01

相关推荐

  • Java Optional.orElse与orElseGet区别

    orElse总是执行默认值计算,而orElseGet仅在Optional为空时调用Supplier获取,默认值构造 costly 时应优先使用orElseGet以避免性能浪费。 在 Java 8 引入的 Optional 类中,orElse 和 orElseGet 都用于在 Optional 值为空…

    2026年9月24日
    000
  • VSCode如何优化多语言混编 VSCode复合工程项目的管理技巧

    #%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8处理多语言混编和复杂项目的核心策略是使用多根工作区(multi-root workspace),通过创建.code-workspace文件将不同语言或模块的目录统一管理,实现跨项目文件浏…

    2026年9月24日
    000
  • Java中接口常量和类常量的使用区别

    接口常量默认public static final,用于行为契约但易导致职责模糊;类常量可用不同访问修饰符,更适合封装和维护。现代Java推荐使用专用常量类、枚举、私有静态常量或配置文件管理常量,以提升代码清晰度与可维护性。 Java中接口常量和类常量,核心区别在于它们的定义位置和隐式属性。接口常量…

    2026年9月24日
    000
  • 怎样处理C++中的野指针问题 空指针检测与防御性编程

    怎样处理C++中的野指针问题 空指针检测与防御性编程怎样处理C++中的野指针问题 空指针检测与防御性编程怎样处理C++中的野指针问题 空指针检测与防御性编程怎样处理C++中的野指针问题 空指针检测与防御性编程

    野指针难以发现是因为其指向已失效或非法内存,解引用会导致未定义行为。1. 初始化是关键防线,声明指针时必须赋初值或设为nullptr;2. 使用智能指针std::unique_ptr和std::shared_ptr可自动管理内存生命周期,避免手动delete遗漏;3. 防御性编程要求每次使用指针前进…

    2026年9月24日 用户投稿
    200
  • 抖音粉丝LV0到LV6等级要卖多少钱,2025年抖音粉丝最新价格参考

    抖音达人带货等级从lv0到lv6级,都需要卖多少钱?很多新手朋友都不清楚带货等级是如何划分的额,也不清楚每个等级都需要多少交易额,相匹配的抖音粉丝数量是多少,接下来小编会带领大家详细了解下抖音粉丝带货等级的区别和2025年抖音最新的价格参考明细: 一,抖音粉丝等级划分标注和对应粉丝数量: 1,LV0…

    2026年9月24日
    000
  • VSCode如何调试React前端应用 VSCode调试React组件的完整教程

    要调试react前端应用,首先需安装vscode的浏览器调试插件并配置launch.json文件,1. 安装“debugger for chrome”或对应浏览器的插件;2. 在项目根目录的.vscode文件夹中创建launch.json,配置type为chrome、request为launch、n…

    2026年9月24日
    100
  • VSCode如何通过Dev Containers开发 VSCode开发容器环境的搭建与使用

    vscode通过dev containers提供容器化开发环境,解决了“在我的机器上能运行”的问题。1. 安装docker并配置vscode访问;2. 安装remote – containers扩展;3. 创建.devcontainer文件夹和devcontainer.json文件;4.…

    2026年9月24日
    100
  • VSCode如何集成Cassandra数据库工具 VSCode NoSQL数据库管理插件指南

    解决vscode连接cassandra认证问题的方法是确认cassandra集群是否启用认证,若启用则检查连接配置中的用户名、密码是否正确,并确保authenticator和authorizer配置匹配,如使用passwordauthenticator需提供正确凭据,若使用kerberos等其他认证…

    2026年9月24日
    500
  • VSCode如何设置智能代码折叠策略 VSCode基于语义的自动折叠配置技巧

    vscode通过配置editor.foldingstrategy可实现智能代码折叠,1. 将editor.foldingstrategy设为indentation可基于缩进折叠,适用于缩进规范但语法不严格的文件;2. 使用#region和#endregion标记自定义折叠区域,适用于c#等支持该语法…

    2026年9月24日
    600
  • 时区错误怎样校准?时间同步完整解决方法

    时区错误怎样校准?时间同步完整解决方法时区错误怎样校准?时间同步完整解决方法时区错误怎样校准?时间同步完整解决方法时区错误怎样校准?时间同步完整解决方法

    时区错误和时间同步问题通常由系统时区设置错误、硬件时钟漂移或ntp服务异常导致。1.确保系统时间通过ntp服务准确同步,linux可使用timedatectl检查ntp状态并启用systemd-timesyncd或chronyd,windows则开启自动时间同步;2.正确设置本地时区,linux使用…

    2026年9月24日 用户投稿
    200
  • VS Code微服务开发:Docker与Kubernetes集成

    VS Code通过Docker扩展实现本地容器化开发,支持自动生成Dockerfile、一键构建镜像及devcontainer环境一致性;2. Kubernetes扩展可连接集群并管理资源,结合Bridge to Kubernetes实现本地调试与集群网络集成;3. 使用Skaffold自动化构建部…

    2026年9月24日
    100
  • Intel OpenCAS缓存加速方案

    open cas 架构概览:数据从hdd盘读取后被复制到open cas的缓存中,后续的读取操作从内存中进行,从而提高读写效率。在write-through模式下,所有数据同步刷新到open cas的ssd和后端的hdd中。在write-back模式下,数据同步写入到open cas的ssd中,然后…

    2026年9月24日
    500
  • VSCode如何实现AI代码反混淆 VSCode智能分析混淆代码的技巧

    vscode没有一键ai反混淆功能,但可通过智能扩展、调试器、ast查看器、代码格式化工具及外部ai工具集成来辅助分析和逐步还原混淆代码;2. 利用eslint、prettier等扩展提升代码可读性,通过“重命名符号”“转到定义”“查找引用”等功能追踪变量和函数流向,结合多光标编辑和代码片段进行手动…

    2026年9月24日
    200
  • 小红书推广选择阅读量还是粉丝量?小红书怎么推广引流

    小红书作为融合内容、社交与电商的综合性平台,近年来吸引了大量创作者和品牌入驻。在进行推广时,很多人常常纠结:是更重视阅读量,还是更关注粉丝量?本文将从两者的定义出发,分析各自的优劣势,并提供实用建议,帮助你制定适合自己的推广策略。 一、阅读量与粉丝量的本质区别 1. 阅读量 阅读量代表的是某篇笔记或…

    2026年9月24日
    100
  • 苹果15换屏幕费用是多少

    官方维修费用:品质与保障的代价 苹果官方售后以其高标准的服务和原装零部件著称。针对iPhone 15的屏幕更换,官方定价普遍处于1000元至2000元区间,具体费用会因机型差异(如标准版与Pro版)以及所在城市而有所不同。这一价格不仅体现了苹果品牌的技术投入与服务保障,也确保了维修后的设备性能与出厂…

    2026年9月24日
    400
  • VSCode 怎样配置终端默认路径 VSCode 终端默认路径的配置技巧​

    在 vscode 中配置终端默认启动路径需修改 terminal.integrated.cwd 设置项;2. 可通过用户设置(全局生效)或工作区设置(项目专属)进行配置,优先级为工作区设置覆盖用户设置;3. 路径可使用绝对路径或相对路径(推荐相对路径以提升协作性),windows 系统需注意反斜杠转…

    2026年9月24日
    100
  • 《Python完全自学教程》免费在线连载1.5

    《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5《Python完全自学教程》免费在线连载1.5

    说明: 本节内容,是针对非计算机专业的读者提供的补充知识。 1.5 操作系统 本节不是全面介绍操作系统知识,是提醒读者从开发者的角度认识自己的操作系统——根据多年的经验,至少要能熟练使用一些命令完成常见操作。 首先要声明硬件设备,本书所演示的代码都是基于个人计算机( Personal Compute…

    2026年9月24日 用户投稿
    800
  • 探索VSCode Jupyter Notebook集成与扩展

    VSCode集成Jupyter Notebook提升开发效率,安装Jupyter扩展后可直接运行.ipynb文件,支持内核选择、Shift+Enter执行单元格、图表渲染及变量状态保留;结合Python扩展、Pylance、GitLens等工具,实现调试、智能提示、版本控制与代码转换,适合数据分析与…

    2026年9月24日
    100
  • Linux用户adduser与useradd命令区别

    adduser是交互式脚本,默认创建家目录并设密码,适用于Debian/Ubuntu;2. useradd是底层命令,需手动加参数创建家目录和Shell,通用性强,适合脚本使用。 在Linux系统中,adduser 和 useradd 都可以用来创建新用户,但它们在实现方式、使用习惯和功能上存在明显…

    2026年9月24日
    100
  • 如何在PHP的require语句中传递参数并有效管理变量作用域

    本文探讨了在php中使用`require`或`include`语句时如何向被引入文件传递参数。文章详细阐述了通过直接变量作用域共享、利用`$_get`超全局变量(不推荐)以及将引入文件内容封装为函数或类(推荐最佳实践)这三种方法,并提供了相应的代码示例,旨在帮助开发者理解和选择最适合其场景的参数传递…

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信