赞
踩
构建的一维数组只含有一层方括号 array([1,2,3]),N维数组有N层方括号。
- import numpy as np
-
- a = np.array([1, 2, 3, 4, 5]) # 创建一维数组
- print(a)
-
- #>>>array([1, 2, 3, 4, 5]) # 输出一维array,数据外面只有一层方括号‘[]’
array的位置从左侧数从0开始算的,第一个元素的位置是0,第二个元素的位置是1;从右侧数是从-1开始算的,最后一个元素的位置是-1,导数第二个元素的位置是-2,以此类推。两种方式都可以指定某个元素的位置。
- # 提取第一个元素
- print(a[0])
- #>>>1
-
- # 提取最后一个元素
- print(a[-1])
- #>>>5
提取范围元素时,范围的下限位置处的元素将被提取,范围上限位置的元素将不被提取,如a[1:4] 将提取a[1],a[2],a[3] 构成的数组,而不考虑a[4]。对于包含端点的情况,包含左端点则可使用a[:2] 的形式,包含又端点则使用a[2:]的形式。a[:]代表提取所有元素。
- # 提取连续范围 第0~2 个元素
- print(a[:3])
- #>>>[1 2 3]
-
- # 提取第3个以后的元素(包括第3个元素)
- print(a[3:])
- #>>>[4 5]
-
- # 提取所有元素
- print(a[:])
- #>>>[1 2 3 4 5]
可通过np.take() 提取多个不连续的元素,对于一维数组来说,较为简单,不用指定维度。方法类似提取单个元素,
- # 提取任意不连续的元素
- print(a.take([1,3,4]))
- #>>>[2 4 5]
与一维数组类似,当取出单个元素时,np.array中最后一位的位置是9,位置-1也可以代表最后一个位置,使用位置9或者位置-1都能取出最后一个橼属。与数组不同的是行矢量是二维,提取某个参数时需要指定元素在两个维度下的位置如 a[0,0]代表两个维度中位置都为0的元素。
- import numpy as np
- a=np.arange(10).reshape(1,-1)
-
- print(a) # 打印出a
- #>>> a = [[0 1 2 3 4 5 6 7 8 9]]
- print(a[0,-1]) # 打印最后一个数,方法1
- >>>9
- print(a[0,9]) # 打印最后一个数,方法2
- >>>9
当进行范围切片时,np.array的特性是包含初始位置而不包含结尾位置。-1代表的是最后一个位置,若从某个范围到-1进行范围取值,得到的结果将不包含最后一个元素。
- print(a[:6,0]) # 打印范围时,不包括(:6)末尾的边界6位置
- >>> a[:6,0] = [0 1 2 3 4 5]
- print(a[:-1,0]) # 打印范围时,不包括(:-1)末尾的边界-1位置
- >>> a[:-1,0] = [0 1 2 3 4 5 6 7 8]
若想包含最后一个元素则需要使用“x:”的形式,意义为取出从位置x到最后一个位置范围内的元素。当使用“:”时将取出当前坐标轴下所有位置的元素。
需要特别注意的是:对二维数组(或更高维数组)进行切片时,若某个维度只通过一个整数指定了一个位置,则得到的是一维数据。此时只能通过reshape函数将其重新转化为二维(或更高维数组),否则可能影响后续的计算。
- print(a[1:,0]) # 打印行范围
- >>> a[1:,0] = [1 2 3 4 5 6 7 8 9]
-
- print(a[:,0]) # 打印所有行范围
- >>> a[:,0] = [0 1 2 3 4 5 6 7 8 9]
解决该问题的方法是:将单个整数位置改为范围表达式(如: 位置1 = 位置范围1:2,所代表的位置信息相同,但a[:,1]将会得到一维数组,a[:,1:2]将会得到二维数组),可见使用范围表达式代表单个位置进行切片可以避免维度减少。
- print(a[:4,:]) # 行向量切片后保持二维
- >>> [[0 1 2 3]]
-
- print(a[:4,0:]) # 行向量切片后保持二维
- >>> [[0 1 2 3]]
-
- print(a[:4,0:1]) # 行向量切片后保持二维
- >>> [[0 1 2 3]]
-
不连续切片时,只能使用np.take(),分别获取每个维度中某些位置的信息,得到的结果和原数据维度相同。
- # 使用 np.take() 进行不连续切片
- print(a.take([0],0))
- #>>>[[1 3 4]]
- print(a.take([0],0).take([1,3,4],1))
- # .take([0],0) 获取维度0 的第一个位置
- # .take([1,3,4],1) 获取维度1 的第1,3,4个位置
- #>>>[[0 1 2 3 4 5 6 7 8 9]]
为简单明了地进行介绍,上述主要针对的是行向量,对于列向量的切片取出元素的方法也是类似的,在此不再赘述。
矩阵的切片进行单元素提取与第2节相同,不再赘述。对于范围切片 进行介绍,上代码:生成2*5阶矩阵,进行切片操作,每个维度的切片位置方式与前面介绍的相同。但需要注意的是,某个维度只需要一个坐标位置下的元素时,最好将其表示为范围提取的形式,以避免数据降维。对于二维离散位置的切片提取,可采用np.take()完成相关操作。
- import numpy as np
-
- # 生成2维数组
- a=np.arange(10).reshape(2,5)
-
- print(a) # 打印出a
- >>>[[0 1 2 3 4]
- [5 6 7 8 9]]
-
- # 提取第一行,使用范围切片形式,结果仍为2维
- print(a[0:1,:])
- >>>[[0 1 2 3 4]]
-
- # 提取第一行中的1,3,4三个位置元素组成的2维数组
- print(a.take([0],0))
- #>>>[[0 1 2 3 4]]
-
- print(a.take([0],0).take([1,3,4],1))
- #>>>[[1 3 4]]
总的来说,对于array数据进行切片应注意:1)切片时指定各个维度坐标时,无论位置数量是否为1,都应尽量采用范围表示的形式,以避免产生维度丢失影响后续的计算结果。2)对于不连续切片可采用np.take()函数进行切片,既可实现不连续切片也可以保持矩阵原有的维度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。