更多关于:NumPy…
目录
单个元素索引
切片支持
索引数组
布尔索引数组
结构化索引工具
给被索引的数组赋值
单个元素索引
1-D数组的单元素索引是人们期望的。它的工作原理与其他标准Python序列一样。它是从0开始的,并且接受负索引来从数组的结尾进行索引。
>>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 8
>>> x.resize(2,5) >>> x
array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> x[1,3] 8 >>> x[1,-1] 9 >>> x[1][-1] 9
注意:使用切片不会复制内部数组数据,但也会生成原始数据的新视图。
关于reshape的具体用法,详见:Numpy 修炼之道 (7)—— 形状操作
索引数组
Numpy数组可以被其他数组索引。对于索引数组的所有情况,返回的是原始数据的副本,而不是一个获取切片的视图。
索引数组必须是整数类型。
>>> x = np.arange(10,1,-1) >>> x array([10, 9, 8, 7, 6, 5, 4, 3, 2]) >>> x[np.array([3, 3, 1, 8])] array([7, 7, 9, 2])
使用索引数组来对被索引数组进行索引后,会生成一个与索引数组形状相同的新数组,只是这个新数组的值会用被索引数组中对应索引的值替代。
x[np.array([3, 3, 1, 8])]
布尔索引数组
使用(整数)索引列表时,需要提供要选择的索引列表,最后生成的结果形状与索引数组形状相同;但是在使用布尔索引时,布尔数组必须与要编制索引的数组的初始维度具有相同的形状。在最直接的情况下,布尔数组具有相同的形状:
>>> y array([[ 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]]) >>> b = y > 20 >>> y[b] array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])
与整数索引数组的情况不同,在布尔数组中,结果是1-D数组,其包含索引数组中的所有元素,对应于布尔数组中的所有真实元素。索引数组中的元素始终以行优先(C样式)顺序进行迭代和返回。结果也与y[np.nonzero(b)]
相同。与索引数组一样,返回的是数据的副本,而不是一个获取切片的视图。
如果y比b的维数更高,则结果将是多维的。例如:
>>> b[:,5] # use a 1-D boolean whose first dim agrees with the first dim of y array([False, False, False, True, True], dtype=bool) >>> y[b[:,5]] array([[21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 31, 32, 33, 34]])
这里,从索引数组中选择第4和第5行,并组合以形成2-D数字组。
结构化索引工具
为了便于数组形状与表达式和赋值关系的匹配,可以在数组索引中使用np.newaxis对象来添加大小为1的新维。例如:
>>> y.shape (5L, 7L) >>> y[:,np.newaxis,:].shape (5L, 1L, 7L)
注意,在数组中没有新的元素,只是维度增加。这可以方便地以一种方式组合两个数组,否则将需要明确重塑操作。例如
>>> x = np.arange(5) >>> x array([0, 1, 2, 3, 4]) >>> x[:,np.newaxis] + x[np.newaxis,:] array([[0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]])
省略语法(三个点)可以用于指示完全选择任何剩余的未指定维度。如果数组z的形状是(3,3,3,3),那么z[1,…,2]等效于z[1,:,:,2]。例如:
>>> z = np.arange(81).reshape(3,3,3,3) >>> z[1,...,2] array([[29, 32, 35], [38, 41, 44], [47, 50, 53]]) >>> z[1,:,:,2] array([[29, 32, 35], [38, 41, 44], [47, 50, 53]])
squeeze() 方法可以去除多余的轴,即返回一个将所有长度为1的维度去除的新数组。
>>> a = np.arange(6) >>> a.shape = (2,1,3) >>> a array([[[0, 1, 2]], [[3, 4, 5]]]) >>> a.squeeze().shape (2L, 3L)
给被索引的数组赋值
可以使用单个索引,切片,索引和布尔数组来选择数组的子集来分配。分配给索引数组的值必须是形状一致的(相同的形状或可广播到索引产生的形状)。例如,允许为切片分配常量:
>>> x = np.arange(10) >>> x[2:7] = 1
或正确大小的数组:
>>> x[2:7] = np.arange(5)