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

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

1.1构建一维数组

构建的一维数组只含有一层方括号 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,数据外面只有一层方括号‘[]’

1.2 提取单个元素

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

# 提取第一个元素
print(a[0]) 
#>>>1

# 提取最后一个元素
print(a[-1]) 
#>>>5

1.3 提取范围元素

提取范围元素时,范围的下限位置处的元素将被提取,范围上限位置的元素将不被提取,如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]

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

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

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

2.行向量和列向量切片

2.1行向量提取单个元素

与一维数组类似,当取出单个元素时,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到最后一个位置范围内的元素。当使用“:”时将取出当前坐标轴下所有位置的元素。

2.2 行向量提取范围切片

需要特别注意的是:对二维数组(或更高维数组)进行切片时,若某个维度只通过一个整数指定了一个位置,则得到的是一维数据。此时只能通过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]]

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]]

 

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

 

3 矩阵切片

矩阵的切片进行单元素提取与第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()函数进行切片,既可实现不连续切片也可以保持矩阵原有的维度。

  • 24
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txh3093

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值