Python高级特性——详解多维数组切片(Slice)

Python高级特性:详解多维数组切片(Slice)

1. 多维数组切片基本用法

切片是 Python 中常用的一种操作,可以用来切分列表、字符串、元组等序列型数据,多维数组也不例外。对于二维数组,切片只需在索引号中加入" : "符号,即可切分整行或整列。而对于多维数组,我们可以在切片表达式中使用多个" : "符号,来对各个维度进行切片。

下面是一个基本的多维数组切片例子:

import numpy as np

a = np.array([    # 创建一个二维数组
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

print(a[1:3, 1:3])  # 取数组的第2-3行和第2-3列

以上代码的输出结果为:

[[5 6]
 [8 9]]

在切片表达式 a[1:3, 1:3] 中,第1个":"符号前后的数字表示在第1个维度上,要取从第2个元素到第4个元素中间的子数组;第2个":"符号前后的数字则表示在第2个维度上,要取从第2个元素到第4个元素中间的子数组。由于每个维度都有2个终止切片,所以最终得到的是一个2x2的子数组。

2. 多维数组切片进阶用法

2.1 使用省略号(...)代替多个":"符号

当我们要切片的维度较多时,可以使用省略号(...)代替多个":"符号,如下所示:

import numpy as np

a = np.arange(27).reshape((3, 3, 3))  # 创建一个三维数组

print(a[..., 1])          # 取第2列的值
print(a[1, ...])          # 取第2行的值,这里...后面默认是“:”: a[1, :, :]
print(a[..., :2, :2])     # 取每个维度前两行和前两列的值

以上代码的输出结果为:

[[ 1  4  7]
 [10 13 16]
 [19 22 25]]

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

[[[ 0  1]
  [ 3  4]]

 [[ 9 10]
  [12 13]]

 [[18 19]
  [21 22]]]

2.2 使用负数索引和步长来切片

除了使用一个":"符号来表示所要切片的整个范围,我们还可以使用负数索引和步长来定义切片。

  1. 使用负数索引

负数索引表示从数组的末尾开始往前数的元素。例如,a[-1]表示数组的最后一个元素,a[-2]表示倒数第二个元素。我们可以在切片中使用负数索引来取反向的子数组,如下所示:

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])

print(a[-1])         # 取最后一行
print(a[:,-1])       # 取最后一列
print(a[::-1])       # 反向输出整个数组

以上代码的输出结果为:

[5 6]

[2 4 6]

[[5 6]
 [3 4]
 [1 2]]
  1. 使用步长

步长表示每隔多少个元素取一个值。可以使用":"符号和步长值一起快速切分一个大数组,如下所示:

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])

print(a[::2])    # 每隔一个元素取一行

以上代码的输出结果为:

[[ 1  2]
 [ 5  6]
 [ 9 10]]

3. 多维数组切片进阶应用举例

3.1 将彩色图片转成灰度图

我们知道,彩色图片是由R,G,B三种颜色的像素值组成的,而灰度图像则是只使用灰度值来表示像素的图像。下面是一个将彩色图片转成灰度图的例子:

from PIL import Image
import numpy as np

# 加载图片并转成numpy数组
img = Image.open('pic.jpg').convert('RGB')
img_arr = np.array(img)

# 将RGB三种颜色的像素值加权平均,得到灰度图
gray_arr = np.dot(img_arr[...,:3], [0.299, 0.587, 0.114])

# 将灰度值都限制在0-255之间,防止显示异常
gray_arr = np.clip(gray_arr, 0, 255)

# 转成灰度图
gray_img = Image.fromarray(gray_arr.astype('uint8'))
gray_img.show()

上面的代码中,我们使用PIL库读取图片并转成numpy数组。由于图像是RGB格式的,因此我们只需要取出前3个通道的像素值,然后对其加权平均,得到灰度值。此时,灰度值可能会超过范围(0-255),因此我们再使用np.clip()函数将其限制在0-255之间。最后,我们将灰度值转成整数类型,并使用Image.fromarray()函数将其转成灰度图。运行上述代码,会将彩色图像转化成灰度图。

3.2 使用切片做向量旋转

在游戏开发中,经常需要对游戏对象进行旋转操作。下面是一个使用切片实现向量旋转的例子:

import numpy as np

# 定义一个向量
v = np.array([1, 2])

# 将向量每个维度都乘上一个旋转矩阵,得到新的向量
theta = np.pi / 2
rotate_mat = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])
rotated_v = np.dot(v, rotate_mat)

print(rotated_v)  # [-2.  1.]

上述代码中,我们首先定义了一个向量 v。然后,我们构造一个以原点为中心,逆时针旋转90度的旋转矩阵,将其命名为rotate_mat。旋转矩阵是一个2x2的矩阵,旋转后的坐标可表示为 旋转矩阵 * 原坐标。我们使用np.dot()函数将向量v和旋转矩阵相乘,得到旋转后的向量rotated_v。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python高级特性——详解多维数组切片(Slice) - Python技术站

(1)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • 详解Python PIL的logical_and()和logical_or()方法

    Python PIL(Python Imaging Library)是Python编程语言中的图像处理库。它允许开发人员在Python代码中处理图像,进行各种复杂的图像操作,如裁剪、调整大小、改变图像格式、增加滤镜等。其中,logical_and()和logical_or()是PIL库提供的图像逻辑运算函数,用于将两张二进制图像进行逻辑与操作和逻辑或操作。 …

    python-answer 2023年3月25日
    00
  • python简单图片操作:打开\显示\保存图像方法介绍

    python简单图片操作:打开/显示/保存图像方法介绍 在Python中,我们可以使用PIL模块来对图像进行简单的操作,包括打开、显示和保存图像等方法。 安装PIL模块 在使用PIL模块之前,我们需要先安装它。在命令行中输入以下命令来安装PIL模块: pip install Pillow 打开图像 使用PIL模块中的Image类的open()方法可以打开一张…

    python 2023年5月18日
    00
  • python+Tkinter+多线程的实例

    Python+Tkinter+多线程的实例 Python是一种非常流行的编程语言,支持多种图形界面编程库,其中比较常用的是Tkinter。在Tkinter中,一般情况下GUI程序是单线程的,但可以利用多线程技术来实现一些特定功能的程序设计。本文将详细讲解如何使用Python+Tkinter+多线程编写程序,以实现更加高效的程序设计。 安装Python和Tki…

    python 2023年5月18日
    00
  • python编写图书管理系统

    Python编写图书管理系统 简述 本文将介绍使用Python编写图书管理系统的完整攻略。图书管理系统是一种常见的信息管理系统,它可以对图书进行基本的管理和查询操作。Python作为一种高效、简洁的编程语言,适合用来编写此类小型应用程序。 开发环境 本文使用Python 3.6及以上版本进行开发,并在Windows、MacOS和Linux操作系统上测试通过。…

    python 2023年5月30日
    00
  • Python环境下安装PyGame和PyOpenGL的方法

    Python是一门强大的编程语言,也是游戏和图形处理方面的首选。Pygame和PyOpenGL是两个流行的Python库,用于开发2D和3D游戏,以及图形的绘制和渲染。 要安装Pygame和PyOpenGL,在Python环境中可以通过以下步骤来完成: 安装Pygame 若要安装Pygame,请按照以下步骤进行: 步骤1:安装pip 在Python环境中,p…

    python 2023年5月14日
    00
  • Python实现字典去除重复的方法示例

    下面是Python实现字典去除重复的方法示例的完整攻略: 1. 问题描述 在处理数据时,我们有时会遇到字典中存在重复元素的情况。这就需要使用Python语言实现字典去除重复的方法。本文旨在介绍两种Python实现字典去重的方法,以帮助解决相关问题。 2. 方法一:使用setdefault()方法 Python中字典是一种可变容器模型,可存储任意类型对象。在字…

    python 2023年5月13日
    00
  • python实现记事本功能

    以下是Python实现记事本功能的完整攻略。 步骤一:创建GUI界面 要实现记事本功能,首先需要创建GUI界面。可以使用Python中内置的Tkinter库来创建GUI界面。 示例代码: import tkinter as tk root = tk.Tk() # 设置窗口大小 root.geometry("500×500") # 设置窗口…

    python 2023年5月19日
    00
  • Python绘图之turtle库的基础语法使用

    下面是关于“Python绘图之turtle库的基础语法使用”的完整攻略: 一、概述 Turtle是Python内置的绘图库,可以帮助我们快速绘制出不同形状的图案、简单的动画以及有趣的游戏。它是非常适合初学者入门的一个模块,因为它易于理解、有趣、直观,并且代码简单易懂。 在使用Turtle绘图之前,需要先导入模块,具体语法为: import turtle 二、…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部