当前位置:   article > 正文

python 对array进行元素提取、范围切片及不连续多点切片_array取元素

array取元素

1.从一维数组中取出元素

1.1构建一维数组

构建的一维数组只含有一层方括号 array([1,2,3]),N维数组有N层方括号。

  1. import numpy as np
  2. a = np.array([1, 2, 3, 4, 5]) # 创建一维数组
  3. print(a)
  4. #>>>array([1, 2, 3, 4, 5]) # 输出一维array,数据外面只有一层方括号‘[]’

1.2 提取单个元素

array的位置从左侧数从0开始算的,第一个元素的位置是0,第二个元素的位置是1;从右侧数是从-1开始算的,最后一个元素的位置是-1,导数第二个元素的位置是-2,以此类推。两种方式都可以指定某个元素的位置。

  1. # 提取第一个元素
  2. print(a[0])
  3. #>>>1
  4. # 提取最后一个元素
  5. print(a[-1])
  6. #>>>5

1.3 提取范围元素

提取范围元素时,范围的下限位置处的元素将被提取,范围上限位置的元素将不被提取,如a[1:4] 将提取a[1],a[2],a[3] 构成的数组,而不考虑a[4]。对于包含端点的情况,包含左端点则可使用a[:2] 的形式,包含又端点则使用a[2:]的形式。a[:]代表提取所有元素。

  1. # 提取连续范围 第0~2 个元素
  2. print(a[:3])
  3. #>>>[1 2 3]
  4. # 提取第3个以后的元素(包括第3个元素)
  5. print(a[3:])
  6. #>>>[4 5]
  7. # 提取所有元素
  8. print(a[:])
  9. #>>>[1 2 3 4 5]

1.4 提取多个不连续元素(非常有用)

可通过np.take() 提取多个不连续的元素,对于一维数组来说,较为简单,不用指定维度。方法类似提取单个元素,

  1. # 提取任意不连续的元素
  2. print(a.take([1,3,4]))
  3. #>>>[2 4 5]

2.行向量和列向量切片

2.1行向量提取单个元素

与一维数组类似,当取出单个元素时,np.array中最后一位的位置是9,位置-1也可以代表最后一个位置,使用位置9或者位置-1都能取出最后一个橼属。与数组不同的是行矢量是二维,提取某个参数时需要指定元素在两个维度下的位置如 a[0,0]代表两个维度中位置都为0的元素。

  1. import numpy as np
  2. a=np.arange(10).reshape(1,-1)
  3. print(a) # 打印出a
  4. #>>> a = [[0 1 2 3 4 5 6 7 8 9]]
  5. print(a[0,-1]) # 打印最后一个数,方法1
  6. >>>9
  7. print(a[0,9]) # 打印最后一个数,方法2
  8. >>>9

当进行范围切片时,np.array的特性是包含初始位置而不包含结尾位置。-1代表的是最后一个位置,若从某个范围到-1进行范围取值,得到的结果将不包含最后一个元素。

  1. print(a[:6,0]) # 打印范围时,不包括(:6)末尾的边界6位置
  2. >>> a[:6,0] = [0 1 2 3 4 5]
  3. print(a[:-1,0]) # 打印范围时,不包括(:-1)末尾的边界-1位置
  4. >>> a[:-1,0] = [0 1 2 3 4 5 6 7 8]

若想包含最后一个元素则需要使用“x:”的形式,意义为取出从位置x到最后一个位置范围内的元素。当使用“:”时将取出当前坐标轴下所有位置的元素。

2.2 行向量提取范围切片

需要特别注意的是:对二维数组(或更高维数组)进行切片时,若某个维度只通过一个整数指定了一个位置,则得到的是一维数据。此时只能通过reshape函数将其重新转化为二维(或更高维数组),否则可能影响后续的计算。

  1. print(a[1:,0]) # 打印行范围
  2. >>> a[1:,0] = [1 2 3 4 5 6 7 8 9]
  3. print(a[:,0]) # 打印所有行范围
  4. >>> a[:,0] = [0 1 2 3 4 5 6 7 8 9]

解决该问题的方法是:将单个整数位置改为范围表达式(如: 位置1 = 位置范围1:2,所代表的位置信息相同,但a[:,1]将会得到一维数组,a[:,1:2]将会得到二维数组),可见使用范围表达式代表单个位置进行切片可以避免维度减少。

  1. print(a[:4,:]) # 行向量切片后保持二维
  2. >>> [[0 1 2 3]]
  3. print(a[:4,0:]) # 行向量切片后保持二维
  4. >>> [[0 1 2 3]]
  5. print(a[:4,0:1]) # 行向量切片后保持二维
  6. >>> [[0 1 2 3]]

2.3 行矢量不连续切片

不连续切片时,只能使用np.take(),分别获取每个维度中某些位置的信息,得到的结果和原数据维度相同。

  1. # 使用 np.take() 进行不连续切片
  2. print(a.take([0],0))
  3. #>>>[[1 3 4]]
  4. print(a.take([0],0).take([1,3,4],1))
  5. # .take([0],0) 获取维度0 的第一个位置
  6. # .take([1,3,4],1) 获取维度1 的第13,4个位置
  7. #>>>[[0 1 2 3 4 5 6 7 8 9]]

 

为简单明了地进行介绍,上述主要针对的是行向量,对于列向量的切片取出元素的方法也是类似的,在此不再赘述。

 

3 矩阵切片

矩阵的切片进行单元素提取与第2节相同,不再赘述。对于范围切片 进行介绍,上代码:生成2*5阶矩阵,进行切片操作,每个维度的切片位置方式与前面介绍的相同。但需要注意的是,某个维度只需要一个坐标位置下的元素时,最好将其表示为范围提取的形式,以避免数据降维。对于二维离散位置的切片提取,可采用np.take()完成相关操作。

  1. import numpy as np
  2. # 生成2维数组
  3. a=np.arange(10).reshape(2,5)
  4. print(a) # 打印出a
  5. >>>[[0 1 2 3 4]
  6. [5 6 7 8 9]]
  7. # 提取第一行,使用范围切片形式,结果仍为2
  8. print(a[0:1,:])
  9. >>>[[0 1 2 3 4]]
  10. # 提取第一行中的1,3,4三个位置元素组成的2维数组
  11. print(a.take([0],0))
  12. #>>>[[0 1 2 3 4]]
  13. print(a.take([0],0).take([1,3,4],1))
  14. #>>>[[1 3 4]]

总的来说,对于array数据进行切片应注意:1)切片时指定各个维度坐标时,无论位置数量是否为1,都应尽量采用范围表示的形式,以避免产生维度丢失影响后续的计算结果。2)对于不连续切片可采用np.take()函数进行切片,既可实现不连续切片也可以保持矩阵原有的维度。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号