第5章 高级数组

本章将介绍数组的一些更为高级的概念。首先,我们将介绍数组视图的概念,其次介绍布尔数组和数组的比较。我们还将简要介绍索引及向量化、解释稀疏数组以及一些特殊的主题,比如广播。

为了精确地控制内存的使用方式,NumPy包提供了数组视图的概念。视图是与较大数组共享相同数据的较小数组,这与单个对象的引用类似(见第1.3节)。

下面通过一个数组切片给出了最简单的数组视图示例:

M = array([[1.,2.],[3.,4.]])
v = M[0,:]  # M的第一行

上述切片是数组M的视图,它与M共享相同的数据。如果修改VM也会同时被修改:

v[-1] = 0.
v  # 数组([[1.,0.]])
M  # 数组([[1.,0.],[3.,4.]]) # M也被修改了

数组的属性base使得访问拥有数据的对象成为可能:

v.base  # 数组([[1.,0.],[3.,4.]])
v.base is M  # True

如果数组拥有其本身的数据,则其属性base的值为none:

M.base  # None

关于哪些切片将返回视图、哪些切片将返回副本都有明确的规则。只有基本切片(主要为带冒号的索引表达式)将返回视图,而任何高级切片(例如使用布尔值的切片)都将返回数据的副本。如下例所示,可以通过使用列表(或数组)进行索引来创建新的矩阵:

a = arange(4) # 数组([0.,1.,2.,3.]) b = a[[2,3]] # 索引是一个列表[2,3] b # 数组([2.,3.]) b.base is None # True,数据被复制 c = a[1:3] c.base is None # False,这只是一个视图 ...

Get Python3.0科学计算指南 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.