python:numpy切片

本文详细介绍了numpy数组中的切片操作,包括不同类型的切片规则,以及如何通过各种方法保留size=1的维度。通过实例演示展示了冒号、步长、特定索引等切片技巧及其影响。
摘要由CSDN通过智能技术生成

1、切片操作类型

  • 第一种:[:,xx,:]冒号没有连写,表示取所在维度的全部;第二维只取了index=xx的元素,即当前维度只有1个值,当前维度会被舍弃。
  • 第二种:[::-2,m:n]逗号前两个连写的冒号表示按step=-2在当前维度的[0,end]范围内取值,如果直接是[::,m:n],则默认step=1,实际就是取当前维度的全部;逗号后面m:n表示当前按step=1在当前维度的[m,n)范围取值;
  • 第三种:[:,xx]逗号后面xx表示特定的数值,和第一种的效果是一样的。
  • 第四种:[:,xx:xx+1]逗号后面的切片虽然也只能取到index=xx这一处的值,但可以保留住当前维的维度不被消除。
  • 第五种:[…,xx]三个点表示前面这些维度的size都保持不变,后面的xx表示最后一个维度只取index=xx处的值。由于最后一维只有1个值,当前维度会被舍弃。
  • 第六种:[…,xx,None] 前面的三个点和xx 参考第五种的解释,最后的None表示扩张1个维度,所以整体是消失一个维度,又新增一个维度,整体维度不变。
    总结

只要某一维的切片没有使用冒号,那当前维在结果中会消失

保留size=1的维度方法:
  • 方法一:[:,xx,None]
  • 方法二:[:,xx,numpy.newaxis]
  • 方法三:[:,[xx]]
  • 方法四:[:,xx].reshape(指定维度)
  • 方法五:[:,xx:xx+1] 虽然最后一维也只取到1个数值,但是这种切片会保留最后一维的维度。

2、代码

import numpy as np
a = np.array([[[1,2,3,4],
               [5,6,7,8],
               [2,3,4,5]],
              [[2,4,6,8],
               [1,3,5,7],
               [5,6,7,8]],
              [[8,6,4,2],
               [9,7,5,3],
               [1,6,9,2]]])
print('a=',a.shape)
# 测试冒号切片
a1=a[::,0:2]
print('a1=',a1.shape,'\n',a1)

# 测试某个维度只取1个元素
b=a[:,0,:]
c=a[:,0]
print('b=',b.shape,'\n',b)
print('c=',c.shape,'\n',c)

# 测试保留size=1的维度
b1=a[:,0,None]
c1=a[:,0,np.newaxis]
d1=a[:,[0]]
e1=a[:,0].reshape(a.shape[0],1,a.shape[2])
print('b1=',b1.shape,'\n',b1)
print('c1=',c1.shape,'\n',c1)
print('d1=',d1.shape,'\n',d1)
print('e1=',e1.shape,'\n',e1)

# 测试3个点
a2 = a[..., 2]
print(a2.shape, '\n', a2)
# 结果
(3, 3) 
 [[3 7 4]
 [6 5 7]
 [4 5 9]]


a3 = a[..., 2,None]
print(a3.shape, '\n', a3)
# 结果
(3, 3, 1) 
 [[[3]
  [7]
  [4]]

 [[6]
  [5]
  [7]]

 [[4]
  [5]
  [9]]]


==========结果输出==============
a= (3, 3, 4)

==========a1开始==============
a1= (3, 2, 4) 
 [[[1 2 3 4]
  [5 6 7 8]]

 [[2 4 6 8]
  [1 3 5 7]]

 [[8 6 4 2]
  [9 7 5 3]]]

==========b开始==============
b= (3, 4) 
 [[1 2 3 4]
 [2 4 6 8]
 [8 6 4 2]]

==========c开始==============
c= (3, 4) 
 [[1 2 3 4]
 [2 4 6 8]
 [8 6 4 2]]

==========b1开始==============
b1= (3, 1, 4) 
 [[[1 2 3 4]]

 [[2 4 6 8]]

 [[8 6 4 2]]]

==========c1开始==============
c1= (3, 1, 4) 
 [[[1 2 3 4]]

 [[2 4 6 8]]

 [[8 6 4 2]]]

==========d1开始==============
d1= (3, 1, 4) 
 [[[1 2 3 4]]

 [[2 4 6 8]]

 [[8 6 4 2]]]

==========e1开始==============
e1= (3, 1, 4) 
 [[[1 2 3 4]]

 [[2 4 6 8]]

 [[8 6 4 2]]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值