Python numpy中ndarray核心原理与内存结构详解
本文深入解析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 : False2. 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内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













