
上QQ阅读APP看书,第一时间看更新
2.3.1 下标对象
首先,多维数组的下标应该是一个长度和数组的维数相同的元组。如果下标元组的长度比数组的维数大,就会出错;如果小,就会在下标元组的后面补“:”,使得它的长度与数组维数相同。
如果下标对象不是元组,则NumPy会首先把它转换为元组。这种转换可能会和用户所希望的不一致,因此为了避免出现问题,请“显式”地使用元组作为下标。例如数组a是一个三维数组,下面使用一个二维列表lidx和二维数组aidx作为下标,得到的结果就不一样。
a = np.arange(3 * 4 * 5).reshape(3, 4, 5) lidx = [[0], [1]] aidx = np.array(lidx) a[lidx] a[aidx] ----------------- -------------------------- [[5, 6, 7, 8, 9]] [[[[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]], [[[20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34], [35, 36, 37, 38, 39]]]]
这是因为NumPy将列表lidx转换成了([0],[1]),而将数组aidx转换成了(aidx, :, :):
a[tuple(lidx)] a[aidx,:,:] ----------------- -------------------------- [[5, 6, 7, 8, 9]] [[[[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]], [[[20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34], [35, 36, 37, 38, 39]]]]
经过各种转换和添加“:”之后得到了一个标准的下标元组。它的各个元素有如下几种类型:切片、整数、整数数组和布尔数组。如果元素不是这些类型,如列表或元组,就将其转换成整数数组。
如果下标元组的所有元素都是切片和整数,那么用它作为下标得到的是原始数组的一个视图,即它和原始数组共享数据存储空间。