numpy 矩阵切片操作解析

前提:

1 假设你已经清楚了python 的list切片操作(这里不过多介绍)。
2 假设你对tensor的维度有了很好的理解,如果没有可以看我之前的博文 tensor维度的理解

切片格式:list[start:stop:step]

直接例子演示

#创建三维矩阵a 
a = np.arange(18).reshape(2,3,3)
print(a)

#输出a:(便于观察重新格式化了输出)
[
[ [ 0 1 2],
[ 3 4 5],
[ 6 7 8] ],

[ [ 9 10 11],
[12 13 14],
[15 16 17] ]
]

第0维: 两个3X3的2维矩阵的方向
第1维: 每个0维下三个3X1的一维矩阵的方向
第2维: 每个3X1矩阵内的三个数值的方向

如果理解了维度的概念,开始进入正题:

print(a[:,1:3,:])
#解析一下a[:,1:3,:]:
#对矩阵a的0维进行 [:] 切片即全部获取该维度
#对矩阵a的1维进行 [1:3] 切片即只从第一项开始获取,获取3-1项。
#对矩阵a的2维进行 [:] 切片即全部获取该维度

输出:
[[[ 3 4 5]
[ 6 7 8]]

[[12 13 14]
[15 16 17]]]

解析:
因为0维全部获取,所以两个3X3的矩阵都会拿到。一维获取的是下标为1的项和下标为3-1的项,注意0维下的两个矩阵都会进行此操作,所以两个3X3矩阵变成了2X3矩阵(被切片)。3维获取的是全部项,所以2X3矩阵下面的数值并没有被切掉。

尝试更复杂的操作:
print(a[0:1,1:3,1:2]) 

输出:
[[[4]
[7]]]

逐步分解:
1 第0维获第零项得到:
[[ [ 0 1 2]
[ 3 4 5]
[ 6 7 8] ]]
2 第1维获取第一和第二项得到:
[[[ 3 4 5]
[ 6 7 8] ]]]
3 第2维获取第一项得到:
[[[ 4 ]
[ 7 ] ]]]

(非常简单)

另一种切片格式:list[num]

看例子:

print(a[:,:,0])

此时第2维的切片是一个值不是[:]形式,表示获取该维度的第num项,这里表示获取第2维的第0项

输出:
[[ 0 3 6]
[ 9 12 15]]

输出的结果少了一个维度。变成了2维。对比第一种切片方式,同样获取第2维的第0项:

print(a[:,:,0:1])

输出:
[[[ 0]
[ 3]
[ 6]]

[[ 9]
[12]
[15]]]

结果依然是三维的。

结论: list[num]形式的切片会引发降维

切片的两个例子:

反转矩阵:
 print(a[::-1])   			# 反转第0维 实质是从后面复制第0维
 print(a[::-1, ::-1])		# 反转第0维和第1维 
 print(a[::-1, ::-1, ::-1])  # 反转第0,1,2维
切片赋值:
a[:,0,:] = -1
print(a) 

输出:
[
[[-1, -1, -1],
[3,4,5],
[6,7,8]],
[-1,-1,-1],
[12,13,14],
[15,16,17]]
]

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

专治跌倒扭伤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值