《利用Python进行数据分析》附录 A.1 ndarray对象内幕

附录A 高阶Numpy


A.1 ndarray 内幕

       NumPy的ndarray提供了一种方法将一组同构数据(连续的或跨步的)解释为多维数组对象。数据类型或dtype决定数据如何被解释为浮点数、整数、布尔值或我们正在查看的任何其他类型。

       让ndarray如此灵活的部分原因是每个数组对象都是一个数据块的分步视图。例如,你可能会想知道数组视图arr[::2, ::-1]如何做到不复制任何数据。原因是ndarray不仅仅是一块内存和一个dtype,它还具有“跨步”信息,使数组能够以不同的步长在内存中移动。更准确地说,ndarray内部包含以下内容:

· 指向数据的指针——即RAM中或内存映射文件中的数据块

· 数据类型或dtype,描述数组中固定大小的值单元格

· 表示数组形状(shape)的元组

· 步长元组,表示要“步进”的字节数的整数以便沿维度推进一个元素

图A-1是简单的ndarray内部构造。

《利用Python进行数据分析》附录 A.1 ndarray对象内幕_第1张图片
图A-1:NumPy的ndarray对象

例如,一个10×5的数组,其shape为(10, 5)

一个典型的(C阶)3×4×5 float64值(8字节)的数组具有跨度(160,40,8)(见图A-2)

《利用Python进行数据分析》附录 A.1 ndarray对象内幕_第2张图片
图A-2:示例

:了解跨度可能是有用的,因为通常特定轴上的跨度越大,沿着该轴执行计算的代价越高

       虽然一般的NumPy用户很少会对数组跨度(strides)感兴趣,但它们是构建“零复制”数组视图的关键因素。跨度甚至可以是负的,这使得数组能够穿过内存“向后”移动(例如,在诸如obj[::-1]或obj[:, ::-1]的切片中就是这种情况)。


A.1.1 NumPy dtype层次结构

       你可能时不时会需要写代码检查数组是否包含整数、浮点数、字符串或Python对象。由于浮点数有多种类型(float16到float128),因此检查dtype是否在类型列表中会非常麻烦。幸运的是,dtype有超类,如np.integer和np.floating,它们可以和np.issubdtype函数一起使用(见图A-3)

《利用Python进行数据分析》附录 A.1 ndarray对象内幕_第3张图片
图A-3:检查代码数组

可以通过调用类型的mro方法来查看特定dtype的所有父类(见图A-4)

《利用Python进行数据分析》附录 A.1 ndarray对象内幕_第4张图片
图A-4:查看父类、检查

图A-5是dtype的层次结构父类-子类关系图

《利用Python进行数据分析》附录 A.1 ndarray对象内幕_第5张图片
图A-5:NumPy dtype 类型层级关系

你可能感兴趣的:(《利用Python进行数据分析》附录 A.1 ndarray对象内幕)