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

先上结论:

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

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

下面进行更加详细的说明。


首先看一个简单的例子:

# 初始化数组
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 wrong\n')

# 尝试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 wrong\n')

# 尝试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 wrong\n')

# 尝试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 wrong\n')

# 尝试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 wrong\n')

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 wrong\n')

# 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 wrong\n')

# 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 wrong\n')

# 尝试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 wrong\n')

# 尝试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 wrong\n')

# 尝试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 wrong\n')

# 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 wrong\n')
同样按照顺序查看

这里输出一下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],后者表示在第一个维度之后添加,而不是最后一个维度后。


实验中其实存在一个问题,即logprint没有按照顺序输出,arr1log信息可能在arr2print输出之后,欢迎大佬提出见解!
在这里插入图片描述

  • 90
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
当你在运行Python代码时出现"ModuleNotFoundError: No module named 'pygame'"错误,这意味着你的Python环境中缺少了pygame模块。这个错误可能是由于以下几个原因造成的: 1. 未正确安装pygame模块。确保你已经使用正确的安装命令安装了pygame模块。可以通过运行"pip install pygame"来安装。如果你使用的是Python 3.x版本,你可能需要运行"pip3 install pygame"。 2. 安装路径不正确。确认你的pygame模块是安装在与你的Python环境相关联的路径上。你可以通过在Python交互式环境中运行以下命令来检查pygame模块的安装路径: ``` import pygame print(pygame.__file__) ``` 确保这个路径是你的Python环境下的site-packages目录中的一个子目录。 3. 环境变量设置不正确。在安装pygame模块之前,你可能需要设置一些环境变量。例如,你可能需要添加Python的安装路径到系统的PATH环境变量中。你可以参考安装pygame的官方文档或其他相关教程来了解更多关于环境变量设置的详细信息。 请检查上述原因并尝试解决问题。如果问题仍然存在,你可以提供更多关于你的操作系统、Python版本和安装过程的详细信息,以便更好地帮助你解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ModuleNotFoundError: No module named ‘pygame’——Python3.6安装pip并下载pygame模块](https://blog.csdn.net/weixin_55560445/article/details/114420381)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [from pygame.locals import *出现ModuleNotFoundError: No module named ‘pygame‘解决办法](https://blog.csdn.net/qq_49042595/article/details/122299673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python中pygame安装过程(超级详细)](https://download.csdn.net/download/weixin_38710566/14914806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值