Python中的3D矩阵操作

2023-09-21 07:00:43

3072062231a7c86db08489d3d2d98653.png

迷途小书童

读完需要

6

分钟

速读仅需 2 分钟

3D 矩阵又称为立体矩阵,是指一个具有三个维度的矩阵结构。相比二维矩阵,它增加了一个深度维度。在 3D 矩阵中,第一个维度表示行数,第二个维度表示列数,第三个维度表示层数或深度,可以想象成一个多层的立方体结构。三维矩阵通常也称为 NxNxN 矩阵,在计算机视觉、医学成像、深度学习、增强现实等各个领域和应用中都非常有用。

本文中,我们将逐步介绍在 Python 中如何实现和使用 3D 矩阵,这里会介绍 2 种方法

  • 使用 python 中的列表

  • 使用 numpy 库

1

   

列表实现

使用嵌套列表来实现 3D 矩阵是相对容易想到的方法。我们将从一个空列表开始,并向其中添加更多列表以表示 3D 矩阵的每一层。在此 3D 矩阵的每一层中,我们将附加列表来表示行,并在每行中添加各个元素。这样,我们将构建一个列表层次结构,模拟矩阵的三个维度。通过遍历列表的层次结构,我们可以访问和修改矩阵中的各个部分。

比如,我们要创建一个全是零的 3D 矩阵

N = 3
three_d_matrix = [[[0 for _ in range(N)] for _ in range(N)] for _ in range(N)]
print(three_d_matrix)

这行代码使用嵌套列表推导式创建一个全是 0 的 3D 矩阵。每个 for _ in range(N) 循环都会创建一个包含 N 个零的一维列表。这里,_ 是当我们不需要循环变量时使用的常见约定。

代码的执行的结果是

[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]

要访问和修改 3D 矩阵中的元素,我们可以这样做

# 给元素赋值
three_d_matrix[0][1][2] = 33

要打印整个 3D 矩阵

for layer in three_d_matrix:
    for row in layer:
        print(row)
    print("-" * 10)

打印语句的输出是

[0,0,0]
[0,0,33]
[0,0,0]
----------
[0,0,0]
[0,0,0]
[0,0,0]
----------
[0,0,0]
[0,0,0]
[0,0,0]
----------

2

   

使用 NumPy 实现

NumPy 是一个用于数值和科学计算的 Pyhton 库,它包含广泛的内置功能,可用于各种用途。要使用 Numpy,首先要做的就是安装 NumPy 库,执行命令

pip install numpy

下面我们来看看如何实现

import numpy as np


N = 3
three_d_matrix = np.zeros((N, N, N), dtype=int)
print(three_d_matrix)

这里通过 np.zeros() 来创建一个全是 0 的 3D 数组,其中 (N, N, N) 参数指定数组的形状,dtype=int 指定数组元素的数据类型。

代码执行的结果是

[[[0 0 0]
  [0 0 0]
  [0 0 0]]


 [[0 0 0]
  [0 0 0]
  [0 0 0]]


 [[0 0 0]
  [0 0 0]
  [0 0 0]]]

访问和修改元素

three_d_matrix[0, 1, 2] = 33

要迭代 3D 矩阵中的每个元素,我们需要借助嵌套 for 循环

import numpy as np


N = 3
array = np.random.rand(N, N, N)


for i in range(N):
    for j in range(N):
        for k in range(N):
            element = array[i, j, k]
            print(f"Element at ({i}, {j}, {k}) = {element}")

矩阵加法

import numpy as np


N = 3
array1 = np.random.rand(N, N, N)
array2 = np.random.rand(N, N, N)
result = array1 + array2
print(result)

类似地,对于减法

import numpy as np


N = 3
array1 = np.random.rand(N, N, N)
array2 = np.random.rand(N, N, N)
result = array1 - array2
print(result)

然后就是乘法

import numpy as np


N = 3 
array1 = np.random.rand(N, N, N)  
array2 = np.random.rand(N, N, N)  
result = np.matmul(array1, array2)
print(result)

转置操作

import numpy as np


N = 3
array = np.random.rand(N, N, N)
transposed_array = array.transpose()
print("Original Array:")
print(array)
print("\nTransposed Array:")
print(transposed_array)

transpose() 是一个内置的 NumPy 函数,用于执行 3D 数组的转置。矩阵的转置是一个新的矩阵,其中的行变成列,列变成行。

3

   

总结

通过实现代码的对比,我们可以清楚地看到,2 种方法中,使用 NumPy 可以更快地执行数值计算,并且具有更丰富的功能,效率也更高。

4

   

免费社群

a156a9c74fdf7b59a85b0488e86a11d2.jpeg

a05c4f10df1bb7b76f3d4a1bc0792fdd.gif

更多推荐

企业图档加密系统

机械制造行业数据安全机械制造企业对于设计工艺的能力要求非常高,其生产工业会涉及到大量设计图纸文档信息,一旦发生产品图纸丢失泄密情况,将造成重大损失。如何用技术手段保护企业的核心数据,保证企业的信息资料不会被无意或恶意泄漏,是所有机械制造企业用户需关心的问题。PC访问地址:https://isite.baidu.com/

【二叉搜索树】将有序数组转换为二叉搜索树-力扣 108 题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kuan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kaf

Controller统一异常处理和yaml配置

目录Controller统一异常处理url解析static下静态资源文件的访问配置类如何访问static下的资源文件yaml基础语法注解赋值批量注入单个注入Controller统一异常处理Controller统一异常处理@ControllerAdvice:统一为Controller进行"增强"@ExceptionHan

微信小程序的疫苗接种预约设计与实现vue+uniapp

对于本小程序的疫苗预约的设计来说,系统开发主要是采用java语言,在整个系统的设计中应用MySql数据库来完成数据存储,具体根据疫苗预约信息的现状来进行开发的,具体根据现实的需求来实现疫苗预约网络化的管理,各类信息有序地进行存储,进入微信小程序的疫苗预约页面之后,方可开始操作主控界面,主要功能包括用户、疫苗分类、疫苗信

html学习综合案例1

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>个人简介</title></head><body><h1>尤

【c++&GDAL】IHS融合

【c++&GDAL】IHS融合基于IHS变换融合,实现多光谱和全色影像之间的融合。IHS分别指亮度(I)、色度(H)、饱和度(S)。IHS变换融合基于亮度I进行变换,色度和饱和度空间保持不变。IHS融合步骤:(1)将多光谱RGB影像变换到IHS空间;(2)基于一定融合规则使用亮度分量I与全色影像进行变换,得到新的全色I

WebGL 选中物体

目录前言如何实现选中物体示例程序(PickObject.js)代码详解gl.readPixels()函数规范示例效果前言有些三维应用程序需要允许用户能够交互地操纵三维物体,要这样做首先就得允许用户选中某个物体。对物体进行选中操作的用处很广泛。比如,让用户选中三维用户界面上的一个按钮,或者让用户选中三维场景中的多张照片中

提升前端开发效率:基于vue的van-radio-group组件封装指南

前言vant作为一款流行的ui框架,其中,van-radio-group组件是一个常用的单选框组件,但有时我们需要根据项目需求进行定制化封装。本文将介绍如何基于vue框架封装van-radio-group组件,让我们一起来探索吧!封装文件在这个组件中,使用了vant框架提供的van-radio-group和van-ra

Linux-网卡和网络配置

链接一篇大佬的博客:Linux之手把手教会修改网卡名称文章目录修改网卡名称步骤1:修改“/etc/default/grub”步骤2:修改“/etc/sysconfig/network-scripts”下的文件步骤3:修改“ifcfg-eth0”配置步骤4:判断操作系统的引导模式步骤5:根据不同的引导模式重新读取配置文件

el-table 列背景色渐变

最初的想法是,给每一行添加背景色,逐行递减透明度,发现结果比较突兀,效果如下:如果有需要这种样式的,代码如下:<template><div><el-table:data="tableData":header-cell-style="headerCellStyle":cell-style="cellStyle"style

Redis Part1

单体架构:一台Web服务器、一台数据库服务器。回顾,关系型数据库:基于二维表来存储数据的数据库就是关系型数据库。MySQL跟Redis的区别:MySQL是关系型数据库,它是基于表来存储数据的,MySQL数据是写在磁盘的,它是跟磁盘进行交互的;Redis是非关系型数据库,它是把数据存储在内存当中的,是跟内存进行交互的。M

热文推荐