当前位置:首页 > 文章列表 > 文章 > python教程 > PythonNumPy数组创建全解析

PythonNumPy数组创建全解析

2025-09-17 11:20:10 0浏览 收藏

golang学习网今天将给大家带来《Python创建NumPy数组方法详解》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习文章或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

NumPy数组创建方法多样,适用于不同场景:1. np.array()可将列表或元组转换为数组,支持指定数据类型,自动进行类型向上转型;2. np.zeros()、np.ones()、np.empty()和np.full()用于创建特定填充值的数组,其中np.empty()不初始化内存,性能更高但需谨慎使用;3. np.arange()和np.linspace()分别生成等差数列和均匀分布数值,适合数值序列构建;4. np.random模块函数可创建各种随机分布的多维数组,常用于模拟和模型初始化。多维数组可通过嵌套列表、reshape()或直接指定形状创建,shape参数定义各维度大小。常见陷阱包括dtype隐式转换、np.empty()未初始化数据误用、reshape元素数不匹配及大数组内存溢出,建议显式指定dtype、合理选择初始化函数、利用-1自动计算维度并注意内存管理。

Python怎么创建一个NumPy数组_NumPy数组的创建与初始化

在Python中创建NumPy数组,我们通常会借助numpy库提供的多种便捷函数。最直接的方式是利用现有的Python列表或元组进行转换,而更高效或特定用途的场景,则会用到像np.zeros(), np.ones(), np.arange(),甚至是np.random模块中的函数来直接生成。选择哪种方法,往往取决于你数据的来源、期望的形状以及初始化的需求。

解决方案

创建NumPy数组的方法多种多样,每种都有其独特的适用场景。这里我将分享几种我个人最常用且认为效率最高的几种:

1. 从Python列表或元组创建:np.array()

这是最基础也最直观的方式。如果你手头已经有了一些数据,比如一个列表或嵌套列表,想把它转换成NumPy数组,np.array()就是你的首选。

import numpy as np

# 从一维列表创建
list_data = [1, 2, 3, 4, 5]
arr_1d = np.array(list_data)
print(f"一维数组: {arr_1d}")
# 输出: 一维数组: [1 2 3 4 5]

# 从嵌套列表创建二维数组
nested_list_data = [[1, 2, 3], [4, 5, 6]]
arr_2d = np.array(nested_list_data)
print(f"二维数组:\n{arr_2d}")
# 输出:
# 二维数组:
# [[1 2 3]
#  [4 5 6]]

# 你也可以指定数据类型,这在处理特定精度要求时很有用
arr_float = np.array([1, 2, 3], dtype=float)
print(f"指定浮点类型的数组: {arr_float}")
# 输出: 指定浮点类型的数组: [1. 2. 3.]

我个人觉得,np.array()的便利性在于它的“万能”,几乎任何序列类型的数据都能往里扔,NumPy会尽力帮你转换。但要注意,如果序列中的元素类型不一致,NumPy会向上转型(upcasting),比如整数和浮点数混在一起,最终数组会是浮点型。

2. 使用占位符函数创建:np.zeros(), np.ones(), np.empty(), np.full()

这些函数在你需要一个特定形状的数组,并且想用特定值(0、1、空值或自定义值)填充时非常有用。

  • np.zeros(shape, dtype=float): 创建一个指定形状和数据类型的全零数组。
  • np.ones(shape, dtype=float): 创建一个指定形状和数据类型的全一数组。
  • np.empty(shape, dtype=float): 创建一个指定形状和数据类型的空数组。这里的“空”意味着数组中的值是未初始化的,它们可能是内存中残留的随机值。这在需要高性能、且你知道后续会立即填充所有值时非常有用,因为它省去了初始化的开销。
  • np.full(shape, fill_value, dtype=None): 创建一个指定形状,并用fill_value填充的数组。
# 创建一个3x4的全零数组
zeros_arr = np.zeros((3, 4))
print(f"全零数组:\n{zeros_arr}")

# 创建一个2x2x2的全一整型数组
ones_arr = np.ones((2, 2, 2), dtype=int)
print(f"全一整型数组:\n{ones_arr}")

# 创建一个2x3的空数组 (内容是随机的)
empty_arr = np.empty((2, 3))
print(f"空数组 (内容随机):\n{empty_arr}") # 每次运行结果可能不同

# 创建一个2x2的数组,全部填充为7
full_arr = np.full((2, 2), 7)
print(f"填充为7的数组:\n{full_arr}")

np.empty()这个函数我个人觉得有点意思,它不像zerosones那么“干净”,它只是给你一块内存,里面有什么完全是随机的,所以用起来得格外小心。但正是这种“不负责任”,让它在需要极致性能、且你知道后续会立即覆盖所有值的场景下显得特别有用。

3. 使用序列生成函数:np.arange(), np.linspace()

当你需要生成一个等差数列或者在指定范围内均匀分布的数值时,这两个函数非常方便。

  • np.arange(start, stop, step, dtype=None): 返回一个在半开区间 [start, stop) 内,以 step 为步长,生成等差数列的数组。
  • np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None): 返回在指定区间 [start, stop] 内,均匀分布的 num 个样本。
# 生成从0到9的数组 (不包含10)
range_arr = np.arange(10)
print(f"arange生成: {range_arr}")
# 输出: arange生成: [0 1 2 3 4 5 6 7 8 9]

# 生成从1到10,步长为2的数组
step_arr = np.arange(1, 11, 2)
print(f"arange带步长: {step_arr}")
# 输出: arange带步长: [1 3 5 7 9]

# 生成从0到10之间,包含10个点的均匀分布数组
linspace_arr = np.linspace(0, 10, 10)
print(f"linspace生成: {linspace_arr}")
# 输出: linspace生成: [ 0.          1.11111111  2.22222222  3.33333333  4.44444444  5.55555556
#                     6.66666667  7.77777778  8.88888889 10.        ]

linspace在科学计算和绘图时尤其好用,比如你想在某个区间内采样函数值,它能保证采样点均匀分布,省去了手动计算步长的麻烦。

4. 随机数数组:np.random模块

NumPy的np.random模块提供了各种创建随机数数组的函数,这在模拟、机器学习模型初始化等场景下非常重要。

# 创建一个3x3的随机浮点数数组 (0到1之间均匀分布)
random_uniform_arr = np.random.rand(3, 3)
print(f"均匀分布随机数组:\n{random_uniform_arr}")

# 创建一个2x4的标准正态分布随机数数组 (均值为0,标准差为1)
random_normal_arr = np.random.randn(2, 4)
print(f"正态分布随机数组:\n{random_normal_arr}")

# 创建一个指定范围的随机整数数组 (low <= x < high)
random_int_arr = np.random.randint(0, 10, size=(2, 5)) # 0到9之间的整数
print(f"随机整数数组:\n{random_int_arr}")

随机数的使用,我个人觉得需要注意seed的设置,尤其是在需要结果可复现的实验中。np.random.seed(42)这样的操作,能保证每次运行代码,生成的随机数序列都是一样的,这对于调试和论文复现至关重要。

NumPy数组与Python列表:性能与用途的深度解析

当我们谈论Python中的数据结构,NumPy数组和Python列表是两个绕不开的话题,尤其是在数值计算领域。它们都能存储数据,但底层实现和设计哲学却大相径庭,这直接影响了它们的性能和最佳使用场景。我个人在初学NumPy时,也曾纠结过什么时候该用列表,什么时候该用数组,后来才慢慢体会到它们各自的“脾气”。

首先,最核心的区别在于数据存储。Python列表是一个高度灵活的容器,它可以存储不同类型的数据(整数、浮点数、字符串甚至是其他对象),并且在内存中这些元素可能分散存储,列表只存储指向这些元素的指针。这种灵活性是以牺牲性能为代价的。每次访问或操作元素,Python都需要进行类型检查和指针解引用。

而NumPy数组,则追求的是同质性紧凑性。它要求所有元素都具有相同的数据类型(例如,全部是32位整数或64位浮点数),并且在内存中是连续存储的。这种连续存储带来了巨大的优势:

  1. 内存效率:由于所有元素类型相同且连续,NumPy数组不需要存储每个元素的类型信息,也不需要存储指向分散内存地址的指针,大大减少了内存开销。
  2. 计算性能:连续存储允许CPU的缓存机制高效工作,减少了缓存未命中的情况。更重要的是,NumPy的底层操作很多是用C或Fortran等编译型语言实现的,这些高度优化的代码可以进行向量化操作。这意味着,对整个数组进行某种操作(比如所有元素加1),NumPy可以一次性处理多个数据,而Python列表则需要通过循环逐个处理,效率低下。

举个例子,如果你要对两个包含一百万个数字的列表进行逐元素相加,Python列表可能需要几秒钟,而NumPy数组可能只需几毫秒。这种量级的差异在处理大数据时是决定性的。

用途方面:

  • Python列表:适用于存储异构数据、需要频繁添加/删除元素(动态大小)、或者数据量不大且对性能要求不高的场景。比如,你可能用列表来存储一个用户的个人信息(姓名、年龄、邮箱等不同类型的数据),或者作为队列、栈等数据结构的底层实现。
  • NumPy数组:是数值计算、科学计算、机器学习和数据分析的基石。它适用于存储同构的数值数据,需要进行大量的数学运算(加减乘除、矩阵乘法、统计分析等)、线性代数操作、傅里叶变换等。在图像处理、信号处理、深度学习等领域,NumPy数组(通常是多维的)更是不可或缺。

我个人的经验是,只要是涉及到数值运算,尤其是当数据量开始变大时,第一时间就应该考虑NumPy数组。列表的灵活性固然好,但在性能面前,往往不得不让位给NumPy的“专一”和高效。

创建多维NumPy数组:从一维到高维的实践指南

NumPy数组的魅力之一就在于它能轻松处理多维数据,这在表示图像(2D)、视频(3D)、时间序列(1D或2D)甚至更复杂的张量数据时至关重要。从一维到高维,NumPy提供了一套直观的创建和操作方式。

1. 从嵌套Python列表创建:np.array()

这是创建多维数组最直接的方法。通过提供嵌套的列表,NumPy会自动推断出数组的维度和形状。

import numpy as np

# 创建一个2x3的二维数组
two_d_array = np.array([[1, 2, 3],
                        [4, 5, 6]])
print(f"二维数组:\n{two_d_array}")
print(f"形状: {two_d_array.shape}") # (2, 3)

# 创建一个2x2x3的三维数组
three_d_array = np.array([[[1, 2, 3],
                           [4, 5, 6]],
                          [[7, 8, 9],
                           [10, 11, 12]]])
print(f"三维数组:\n{three_d_array}")
print(f"形状: {three_d_array.shape}") # (2, 2, 3)

这种方式的优点是直观,但缺点是当维度和大小变大时,手动编写嵌套列表会变得非常繁琐且容易出错。我个人在使用这种方式时,一般只用于创建小型的、测试用的多维数组。

2. 使用占位符函数创建:np.zeros(), np.ones(), np.empty(), np.full()

这些函数在创建多维数组时,只需要将形状参数shape传入一个元组,元组的每个元素代表对应维度的大小。

# 创建一个3x2的全零数组
zeros_2d = np.zeros((3, 2))
print(f"3x2全零数组:\n{zeros_2d}")

# 创建一个2x3x4的全一数组
ones_3d = np.ones((2, 3, 4))
print(f"2x3x4全一数组:\n{ones_3d}")

# 创建一个4x4的空数组
empty_2d = np.empty((4, 4))
print(f"4x4空数组:\n{empty_2d}")

# 创建一个2x2x2的数组,所有元素填充为pi
full_3d = np.full((2, 2, 2), np.pi)
print(f"填充pi的三维数组:\n{full_3d}")

这种方式是我创建大型多维数组时最常用的。它简洁明了,只需要指定形状,NumPy就能帮你搞定内存分配和初始化。

3. 使用np.arange()结合reshape()

np.arange()通常用于生成一维等差数列,但结合.reshape()方法,可以非常灵活地创建各种形状的多维数组。.reshape()不会改变数组的数据,只是改变其视图。

# 生成0到11的序列,然后重塑为3x4的二维数组
reshaped_arr = np.arange(12).reshape(3, 4)
print(f"arange后重塑为3x4:\n{reshaped_arr}")
# 输出:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 重塑为2x2x3的三维数组
reshaped_3d = np.arange(12).reshape(2, 2, 3)
print(f"arange后重塑为2x2x3:\n{reshaped_3d}")
# 输出:
# [[[ 0  1  2]
#   [ 3  4  5]]
#
#  [[ 6  7  8]
#   [ 9 10 11]]]

使用reshape时,需要确保新形状的元素总数与原始数组的元素总数一致。一个很有用的技巧是,可以在reshape中用-1来让NumPy自动计算某个维度的大小,只要其他维度是确定的。比如np.arange(12).reshape(3, -1)会自动计算出第二个维度是4。这个小技巧在处理不确定某个维度大小,但总元素数已知时,特别方便。

4. 随机数生成器的多维应用

np.random模块中的函数也普遍支持多维形状参数。

# 创建一个2x3的0到1之间均匀分布的随机浮点数数组
random_2d_uniform = np.random.rand(2, 3)
print(f"2x3随机均匀分布数组:\n{random_2d_uniform}")

# 创建一个2x2x2的标准正态分布随机数数组
random_3d_normal = np.random.randn(2, 2, 2)
print(f"2x2x2随机正态分布数组:\n{random_3d_normal}")

# 创建一个3x3的0到9之间随机整数数组
random_2d_int = np.random.randint(0, 10, size=(3, 3))
print(f"3x3随机整数数组:\n{random_2d_int}")

创建多维数组的核心在于理解shape元组的含义,它定义了数组在每个维度上的大小。一旦掌握了这一点,无论是从现有数据转换,还是从零开始创建,NumPy都能提供高效且灵活的解决方案。

NumPy数组创建中常见的陷阱与优化策略

在NumPy数组的创建和初始化过程中,虽然API设计得相当直观,但仍然存在一些常见的陷阱,尤其对于初学者而言。同时,为了确保代码的高效运行,我们也有一些优化策略可以遵循。我个人在处理一些大型数据集或者需要高性能计算的项目时,就曾因为这些细节而踩过坑,所以总结了一些经验。

常见的陷阱:

  1. 数据类型(dtype)的隐式转换或不匹配: 当你从Python列表创建NumPy数组时,NumPy会尝试推断最佳的数据类型。如果列表中混合了不同类型(例如整数和浮点数),NumPy通常会向上转型到能容纳所有数据的类型(如从intfloat)。但这有时可能不是你想要的,或者会导致意想不到的精度损失。

    import numpy as np
    
    # 陷阱示例:整数和浮点数混合,导致全部变为浮点数
    mixed_list = [1, 2, 3.0]
    arr_mixed = np.array(mixed_list)
    print(f"混合类型推断: {arr_mixed}, dtype: {arr_mixed.dtype}") # float64
    
    # 陷阱示例:字符串和数字混合,导致全部变为字符串
    str_num_list = [1, 'hello']
    arr_str_num = np.array(str_num_list)
    print(f"字符串和数字混合: {arr_str_num}, dtype: {arr_str_num.dtype}") # <U21 (Unicode string)

    策略: 始终明确指定dtype,特别是在数据类型敏感的场景。例如,np.array([1, 2, 3], dtype=np.int32)

  2. np.empty()的使用不当:np.empty()用于创建未初始化的数组,它不会填充0或1,而是直接分配内存。这意味着数组中可能包含任何值(通常是内存中残留的旧数据)。如果你忘记在使用前对数组进行完全填充,可能会导致计算结果不准确或难以调试的错误。

    # 陷阱示例:未初始化数组的值是随机的
    empty_arr = np.empty((2, 2))
    print(f"未初始化的empty数组:\n{empty_arr}") # 值随机

    策略: 只有当你确定会立即用自己的数据完全覆盖np.empty()创建的数组时才使用它,以获取性能优势。否则,优先使用np.zeros()np.ones()

  3. reshape时的元素总数不匹配: 在使用.reshape()方法时,新形状的元素总数必须与原始数组的元素总数完全一致。如果不是,NumPy会抛出ValueError

    # 陷阱示例:元素总数不匹配
    try:
        np.arange(10).reshape(3, 3) # 10个元素无法重塑为3x3 (9个元素)
    except ValueError as e:
        print(f"重塑错误: {e}")

    策略:reshape时,仔细检查新旧形状的元素总数是否一致。利用-1参数让NumPy自动计算一个维度的大小是一个很好的辅助方法。

  4. 创建大型数组时的内存考量: 虽然NumPy很高效,但创建非常大的数组(例如,几GB甚至几十GB)仍然可能导致内存不足(MemoryError)。

    策略: 在创建大型数组前,估算所需的内存量。如果内存是瓶颈,考虑使用稀疏矩阵(scipy.sparse)或者分块处理(chunking)数据,而不是一次性加载所有数据。

优化策略:

  1. 优先使用NumPy内置函数和向量化操作: 这是NumPy性能优化的核心。避免使用Python的for循环来处理数组元素,因为这会丧失NumPy的性能优势。尽可能使用NumPy提供的函数和运算符,它们都是经过高度优化的C/Fortran实现。

    # 避免:使用

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

学习通分数查看方法详解学习通分数查看方法详解
上一篇
学习通分数查看方法详解
笔趣阁1v1免费入口及无广告方法
下一篇
笔趣阁1v1免费入口及无广告方法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    514次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO  AI Mermaid 流程图:自然语言生成,文本驱动可视化创作
    AI Mermaid流程图
    SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
    661次使用
  • 搜获客笔记生成器:小红书医美爆款内容AI创作神器
    搜获客【笔记生成器】
    搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
    671次使用
  • iTerms:一站式法律AI工作台,智能合同审查起草与法律问答专家
    iTerms
    iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
    694次使用
  • TokenPony:AI大模型API聚合平台,一站式接入,高效稳定高性价比
    TokenPony
    TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
    758次使用
  • 迅捷AIPPT:AI智能PPT生成器,高效制作专业演示文稿
    迅捷AIPPT
    迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
    648次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码