热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NumPy学习指南:深入理解ndarray索引机制

本文详细介绍了NumPy的核心概念——N维数组对象(ndarray),并深入探讨了其索引机制,包括基本索引、切片以及高级索引等。

NumPy 是 Python 中用于科学计算的基础库,其核心功能之一就是提供了强大的 N 维数组对象(ndarray)。本文将详细介绍 ndarray 的结构及其索引方式。


ndarray 对象简介



  • ndarray 是 NumPy 中最基础的数据结构,用于存储同类型的多维数组数据。

  • 每个元素在内存中占用相同的字节空间,确保了高效的存取速度。

  • ndarray 内部包含一个指向实际数据的指针、数据类型描述符(dtype)、数组的形状(shape)以及跨度(stride)信息。


ndarray 的内部结构



  • 数据指针:指向实际数据存储的位置。

  • 数据类型(dtype):描述数组中每个元素的数据类型和大小。

  • 形状(shape):一个元组,表示数组在各个维度上的大小。

  • 跨度(stride):一个元组,表示在每个维度上移动一个单位所需跨越的字节数。


创建 ndarray 的方法



  • 空数组:使用 np.empty() 创建未初始化的数组。

  • 零数组:使用 np.zeros() 创建所有元素均为 0 的数组。

  • 一数组:使用 np.ones() 创建所有元素均为 1 的数组。

  • 全值数组:使用 np.full() 创建所有元素均为指定值的数组。

  • 单位矩阵:使用 np.eye() 创建单位矩阵。

  • 从现有数组创建:使用 np.asarray() 将其他序列转换为 ndarray。

  • 从缓冲区创建:使用 np.frombuffer() 从缓冲区创建数组。

  • 从迭代器创建:使用 np.fromiter() 从迭代器创建数组。

  • 从数值范围创建:使用 np.arange()np.linspace()np.logspace() 从数值范围创建数组。

  • 随机数组:使用 np.random 模块生成随机数组。


ndarray 的索引与切片



  • 基本索引:通过下标访问数组中的单个元素。

  • 切片:类似于 Python 列表的切片操作,用于提取数组的一部分。

  • 高级索引:包括整数数组索引、布尔索引和花式索引。


高级索引示例



  • 整数数组索引:通过整数数组指定多个索引位置。

  • import numpy as np

    x = np.array([[1, 2], [3, 4], [5, 6]])
    t = np.array([[0, 1, 2], [0, 1, 0]])
    y = x[[0, 1, 2], [0, 1, 0]]
    print(y) # 输出: [1 4 5]

  • 布尔索引:通过布尔数组筛选符合条件的元素。

  • x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
    print(x[x > 5]) # 输出: [ 6 7 8 9 10 11]

    a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
    print(a[~np.isnan(a)]) # 输出: [1. 2. 3. 4. 5.]

    a = np.array([1, 2+6j, 5, 3.5+5j])
    print('非复数:', a[~np.iscomplex(a)]) # 输出: 非复数: [1.+0.j 5.+0.j]
    print('复数:', a[np.iscomplex(a)]) # 输出: 复数: [2.+6.j 3.5+5.j]

  • 花式索引:通过任意数组形式的索引来访问数组。


广播机制


广播机制允许不同形状的数组之间进行算术运算,NumPy 会自动扩展较小的数组以匹配较大的数组形状。


丰富的函数支持


NumPy 提供了大量的数学函数和统计函数,支持各种数组操作,如求和、排序、统计等。


推荐阅读
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
author-avatar
bjkml
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有