热门标签 | 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 提供了大量的数学函数和统计函数,支持各种数组操作,如求和、排序、统计等。


推荐阅读
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文提供了一系列Python编程基础练习题,涵盖了列表操作、循环结构、字符串处理和元组特性等内容。通过这些练习题,读者可以巩固对Python语言的理解并提升编程技能。 ... [详细]
  • 本文介绍如何使用 Python 的 xlrd 库读取 Excel 文件,并将其数据处理后存储到数据库中。通过实际案例,详细讲解了文件路径、合并单元格处理等常见问题。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
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社区 版权所有