Python numpy中ndarray核心原理与内存结构详解

Theo
Theo
发布时间:2026-10-15| 4人浏览过
原创

本文深入解析Python numpy库中核心数据结构ndarray的内部原理。详细阐述ndarray的内存布局,包括数据块、dtype、shape及strides对象的作用。通过对比ndarray与Python原生list在数据类型、内存连续性及访问效率上的差异,说明ndarray在科学计算中的性能优势。

在上一期关于Python numpy模块的文章中,我们介绍了该模块的安装、基本使用方法及其主要特点等入门知识。

  • numpy是一个开源的第三方Python库,广泛应用于科学和工程领域,它是科学Python及PyData生态系统的核心组件。
  • numpy模块以其易学易用的特性著称,能够满足从初学者到高级科学研究员的各类需求。
  • 除了与matplotlib配合使用外,numpy还在Pandas、Scipy、scikit-learn等科学Python库中发挥着重要作用。
  • numpy模块提供了多维数组和矩阵数据结构,专门定义了用于创建n维数组对象的ndarray,并提供了针对该对象的高效操作方法。
  • 此外,numpy还支持对数组执行各种数学运算,提供了高级数学函数库以及针对数组和矩阵的操作功能。

众所周知,数组对象是numpy模块的核心功能,本期我们将重点学习numpy数组的相关内容。

1. 什么是 ndarray?

ndarray 概念

数组是numpy模块的核心数据结构。数组本质上是值的网格,其内部包含原始数据、元素定义方式以及元素解释信息。我们可以使用多种方式对元素网格进行索引。

ndarray是numpy模块中定义的n维数组类型,它可以描述同种类型项目的集合。

  • 同种数据类型:numpy数组中的所有元素必须属于同一类型,例如int32、float64等。
  • 同大小内存空间:每个项目占用相同大小的内存块。
  • 同方式解释:每个项目由object数据类型指定,且每个数组都关联一个特定的数据类型对象。
  • 可以使用N个整数对项目的索引进行定位。

ndarray 内部关系

从数组中可以提取由Python对象表示的信息,例如索引是numpy内置数组标量类型之一,我们可以利用数组标量轻松操作复杂的数据排列。

通过上述ndarray内部结构分析,我们可以看到ndarray 主要由dtype、shape、stride组成。

  • ndarray指向内存映射地址的指针,即data对象。
  • 用于形象化解释ndarray元素的dtype对象。
  • 描述每个维度中元素之间间隔的strides对象(元组类型)。
  • 描述每个维度数量和大小的shape对象(元组类型)。

以上四个python对象使得通过索引方式在ndarray中定位指定位置的数据成为可能。

同时,我们可以调用np.array().flags 获取字节序、读写权限等信息,从而得知ndarray 底层是由C和Fortran实现的。

  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

2. ndarray 内存结构

ndarray 内存结构

我们通过numpy.array 方法创建一个二维数组。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

import numpy as np

a = np.array([[1,2],[4,5],[7,8]])

print("dim:",a.ndim)
print("strides:",a.strides)
print("dtype:",a.dtype)
print("data:",a.data)
print("shape:",a.shape)
print(a)

通过array对象调用ndarray 标量对象,可以获知ndarray的维度大小、元素类型、间隔等信息。

通过上述图示,我们可以知道ndarray内存主要划分为两部分:

  • raw data:计算机中一段连续的block,存储在C或Fortran中的数组数据。
  • metdata:有关原始数组数据的元信息。

3. ndarray vs list

ndarray 特点

  • ndarray 要求所有数据必须是同种类型。
  • 每个数据占用的空间大小一致。
  • 数组中存储的数据位于一段连续的空间内。

list 特点

  • 可以容纳不同数据类型。
  • list中只存放对象的引用,再通过引用找到具体的对象。
  • 对象的物理地址并不连续。

 

综上所述,ndarray 查找数据的运行效率比list更快,同时ndarray 存储的数据是连续的一段空间,对比list对象物理地址分散的情况,ndarray比list更节省空间。

总结:

本期学习了numpy模块核心之一ndarray数组对象的内存原理,以及与Python list的对比知识。

ndarray中的所有项目元素均为同类型数据,且存储空间是连续的。

无论是在数据查找、存储还是数据计算等功能上,ndarray都明显优于Python list。

到此这篇关于Python numpy中ndarray介绍的文章就介绍到这了,更多相关Python numpy-ndarray内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。