栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python [ : , : ] [ : ,None , : ] 等形式的意义——Python学习系列

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python [ : , : ] [ : ,None , : ] 等形式的意义——Python学习系列

先上结论:

设有基于python语言的数组arr,arr[ : , : ]表示的是对数组中不同维度索引, 若存在关键字None则表示维度扩充

不妨假设arr维度为(2,3,4),那么arr[1 : 2, 2 : 3, 1 : 3]即表示在第一个维度上,切片选取索引为1的元素,在第二个维度上,切片选取索引为2的元素,最后在第三个维度上,切片选取索引为1、2的元素。

下面进行更加详细的说明。(下文中全红语句为直接结论,其余可以跳过,有时间再看,共3条)


首先看一个简单的例子:
# 初始化数组
import numpy as np
arr = np.array([1,2,3])
# 最基本的直接索引,获取索引为0的元素
print(arr[0])
# 采用切片的方式获取部分元素
print(arr[0:2])  # 获取索引为0, 1的两个元素

PS:数组切片详情参看Python切片索引

实验结果如下:

1
[1, 2]


让我们尝试对这个数组进行arr[ : , : ]形式的引用:
#  创建数组
arr1 = np.array([1, 2, 3])

# 常规切片
print(arr1[0:2])
print(f'init arr1 is: n{arr1}nits shape is: {arr1.shape}n')

# 尝试arr1[:,:]
try:
    print(f'arr1[:,:] is: n{arr1[:, :]}n')
except IndexError:
    logging.info('arr1[:, :] is wrongn')

# 尝试arr1[:, None]
try:
    print(f'arr1[:, None] is: n{arr1[:, None]}nits shape is: {arr1[:, None].shape}n')
except IndexError:
    logging.info('arr1[:, None] is wrongn')

# 尝试arr1[None, :]
try:
    print(f'arr1[None, :] is: n{arr1[None, :]}nits shape is: {arr1[None, :].shape}n')
except IndexError:
    logging.info('arr1[None, :] is wrongn')

# 尝试arr1[:, 0]
try:
    print(f'arr1[:, 0] is: n{arr1[:, 0]}nits shape is: {arr1[:, 0].shape}n')
except IndexError:
    logging.info('arr1[:, 0] is wrongn')

# 尝试arr1[0, :]
try:
    print(f'arr1[0, :] is: n{arr1[0, :]}nits shape is: {arr1[0, :].shape}n')
except IndexError:
    logging.info('arr1[0, :] is wrongn')

PS:注意这里的设置,若可以执行,则采用Print输出(黑色字体),否则使用logging进行记录(红色字体),logging相关详见logging的适用

按照顺序进行查看
  1. 尝试arr1[:,:]
    实验结果如下:(红色字体,表示为logging信息,存在索引错误)

    可见针对维度为(3)的arr1不适用这种形式,因为arr1不存在第二个维度,所以无法进行切片

  2. 尝试arr1[:, None]
    实验结果如下:(黑色字体,表示为print信息)

    通过关键字None,发现arr1的维度增加了1维

  3. 尝试arr1[None, :]
    实验结果如下:(黑色字体,表示为print信息)

    通过关键字None,同样发现arr1的维度增加了1维,这次是在原有维度的前面

  4. 尝试arr1[:, 1]
    实验结果如下:(红色字体,表示为logging信息,存在索引错误)

    同样因为arr1不存在第二个维度,所以无法进行索引

  5. 尝试arr1[1, :]
    实验结果如下:(红色字体,表示为logging信息,存在索引错误)

    原因同上。


接下来尝试对二维数组进行操作

But!!!
在此之前需要先明白:每一个维度是如何表示的

数组维度表示


上图中,从上至下按照维度进行划分,颜色相同的表示一个元素,不同的元素组成当前的维度。形象化即,第k个维度就是数组第k层括号中的内容

二维数组的[: , :]操作
# 初始化数组
arr2 = np.array([[1, 2], [3, 4], [5, 6]])
print(f'init arr2 is: n{arr2}nits shape is: {arr2.shape}n')

# 尝试arr2[0:2, :]
try:
    print(f'arr2[0:2,:] is: n{arr2[0:2, :]}n')
except IndexError:
    logging.info('arr2[0:2, :] is wrongn')

# arr2[:, 0]
try:
    print(f'arr2[:, 0] is: n{arr2[:, 0]}nits shape is: {arr2[:, 0].shape}n')
except IndexError:
    logging.info('arr2[:, 0] is wrongn')

# arr2[0, :]
try:
    print(f'arr2[0, :] is: n{arr2[0, :]}nits shape is: {arr2[0, :].shape}n')
except IndexError:
    logging.info('arr2[0, :] is wrongn')

# 尝试arr2[:, None]
try:
    print(f'arr2[:, None] is: n{arr2[:, None]}nits shape is: {arr2[:, None].shape}n')
except IndexError:
    logging.info('arr2[:, None] is wrongn')

# 尝试arr2[None, :]
try:
    print(f'arr2[None, :] is: n{arr2[None, :]}nits shape is: {arr2[None, :].shape}n')
except IndexError:
    logging.info('arr2[None, :] is wrongn')

# 尝试arr2[:, None, :]
try:
    print(f'arr2[:, None, :] is: n{arr2[:, None, :]}nits shape is: {arr2[:, None, :].shape}n')
except IndexError:
    logging.info('arr2[:, None, :] is wrongn')

# arr2[:, :, None]
try:
    print(f'arr2[:, :, None] is: n{arr2[:, :, None]}nits shape is: {arr2[:, :, None].shape}n')
except IndexError:
    logging.info('arr2[:, :, None] is wrongn')
同样按照顺序查看

这里输出一下init数组,便于比较:

  1. 尝试arr2[0:2, :]
    实验结果如下:(黑色字体,表示为print信息)

    此时可以看出,在第一个维度上,切片选取前两个元素,没有了[5, 6],而在第二个维度上全部保留,可对比init数组查看

  2. 尝试arr2[:, 0]与arr2[0, :]
    实验结果如下:(黑色字体,表示为print信息)

    分别选择第1 or 2维中索引为1的元素,保留剩余维度,可对比init数组查看

  3. 尝试arr2[None, :],arr2[:, None, :]与arr2[:, :, None]
    实验结果如下:(黑色字体,表示为print信息)



    从上至下依次是在第1个维度前,已有维度内,最后1个维度后,添加新的维度,可对比init数组查看

这里需要注意的是:arr2[None, :]与arr2[None, :, :]是等效的,因为这里每一个:就表示对一个维度的引用,所以两个式子均表达在第一个维度前扩充。
!!!但是,arr2[:, :, None]不能简写为arr2[:, None],后者表示在第一个维度之后添加,而不是最后一个维度后。


实验中其实存在一个问题,即log与print没有按照顺序输出,arr1的log信息可能在arr2的print输出之后,欢迎大佬提出见解!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号