首页 > 编程问答 >如何将相同的矩阵与张量的每一行相乘?

如何将相同的矩阵与张量的每一行相乘?

时间:2024-09-25 01:07:15浏览次数:10  
标签:python numpy dot tensordot

我想在没有循环的情况下在两次(X 和 Y)旋转后找到立方体的坐标。

立方体坐标存储为顶点:

cube_vertices = np.array([[0, 0, 0], 
                          [1, 0, 0], 
                          [1, 1, 0], 
                          [0, 1, 0], 
                          [0, 0, 1], 
                          [1, 0, 1], 
                          [0, 1, 1], 
                          [1, 1, 1]])

并且我主要使用边:

cube_edges = np.array([[cube_vertices[0], cube_vertices[1]],
                       [cube_vertices[0], cube_vertices[3]],
                       [cube_vertices[1], cube_vertices[2]],
                       [cube_vertices[3], cube_vertices[2]],
                       [cube_vertices[1], cube_vertices[5]],
                       [cube_vertices[2], cube_vertices[7]],
                       [cube_vertices[3], cube_vertices[6]],
                       [cube_vertices[0], cube_vertices[4]],
                       [cube_vertices[4], cube_vertices[5]],
                       [cube_vertices[4], cube_vertices[6]],
                       [cube_vertices[6], cube_vertices[7]],
                       [cube_vertices[5], cube_vertices[7]]])

我存储它来查找交点这些边缘带有平面。旋转器给出为每个坐标 cube_edges 重复 12 次旋转,因此我可以沿尺寸为 12(边数)的第 0 轴和尺寸为 2(边的两端)的第 1 轴相乘坐标:

phi, theta = 0.1, 0.1
Rx = np.tile(np.array([[1, 0, 0], 
                       [0, np.cos(theta), -np.sin(theta)], 
                       [0, np.sin(theta), np.cos(theta)]]), (12, 2, 1, 1))

Ry = np.tile(np.array([[np.cos(phi), 0, np.sin(phi)], 
                       [0, 1, 0], 
                       [-np.sin(phi), 0, np.cos(phi)]]), (12, 2, 1, 1))
Rxy = Rx * Ry

cube_edges 的形状是 (12, 2, 3) Rxy 的形状是 (12, 2, 3, 3) 对于大小为 (3) 的每点坐标的所有 3x3 单旋转,乘法应沿前两个维度 (12, 2) 进行。我不知道如何利用 np.tensordot 或类似的东西来达到此目的:

rotated_edges = np.tensordot(Rxy, cube_edges)

结果形状 rotated_edges 应该与 cube_edges (12, 2, 3) 相同。

谢谢!


可以使用 NumPy 的广播和点积来实现这一点,而无需使用 tensordot 。方法如下:

import numpy as np

# 立方体顶点和边(你的代码)
cube_vertices = np.array([[0, 0, 0], 
                          [1, 0, 0], 
                          [1, 1, 0], 
                          [0, 1, 0], 
                          [0, 0, 1], 
                          [1, 0, 1], 
                          [0, 1, 1], 
                          [1, 1, 1]])

cube_edges = np.array([[cube_vertices[0], cube_vertices[1]],
                       [cube_vertices[0], cube_vertices[3]],
                       [cube_vertices[1], cube_vertices[2]],
                       [cube_vertices[3], cube_vertices[2]],
                       [cube_vertices[1], cube_vertices[5]],
                       [cube_vertices[2], cube_vertices[7]],
                       [cube_vertices[3], cube_vertices[6]],
                       [cube_vertices[0], cube_vertices[4]],
                       [cube_vertices[4], cube_vertices[5]],
                       [cube_vertices[4], cube_vertices[6]],
                       [cube_vertices[6], cube_vertices[7]],
                       [cube_vertices[5], cube_vertices[7]]])

# 旋转矩阵(你的代码)
phi, theta = 0.1, 0.1
Rx = np.tile(np.array([[1, 0, 0], 
                       [0, np.cos(theta), -np.sin(theta)], 
                       [0, np.sin(theta), np.cos(theta)]]), (12, 2, 1, 1))

Ry = np.tile(np.array([[np.cos(phi), 0, np.sin(phi)], 
                       [0, 1, 0], 
                       [-np.sin(phi), 0, np.cos(phi)]]), (12, 2, 1, 1))
Rxy = Rx * Ry

# 使用广播进行矩阵乘法
rotated_edges = np.sum(Rxy * cube_edges[:, :, np.newaxis, :], axis=3)

# 打印结果形状
print(rotated_edges.shape)  # 输出: (12, 2, 3)

说明:

  1. 广播: cube_edges[:, :, np.newaxis, :] cube_edges 的形状从 (12, 2, 3) 扩展为 (12, 2, 1, 3) 。这允许它与形状为 (12, 2, 3, 3) Rxy 进行广播,从而执行元素乘法,有效地将每个 3x3 旋转矩阵应用于 cube_edges 中的相应点。
  2. 点积: np.sum(..., axis=3) 沿最后一个轴 ( axis=3 ) 计算点积,这对应于矩阵乘法中的求和运算。

最终结果是 rotated_edges 数组,其形状为 (12, 2, 3) ,包含旋转后的边坐标。

标签:python,numpy,dot,tensordot
From: 79019504

相关文章

  • 有没有办法在 python 中获取特定的键盘输入
    我正在为学校开发一个项目,它目前有行输入(“按Enter继续”),它可以工作,但只要用户按Enter键程序继续,输入是什么并不重要,而且我我希望它仅在按下特定键时才起作用。我查了一下,曾经有一个键盘模块,但由于某种莫名其妙的原因它被删除了,那么还有其他方式获取输入吗?你绝对可以......
  • python+flask计算机毕业设计基于微信小程序的法律问题咨询系统设计与实现(程序+开题+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和智能手机的普及,人们获取信息和解决问题的途径日益多样化。在法律服务领域,传统的线下咨询方式已难以满足公众日益增......
  • python+flask计算机毕业设计基于人脸识别的医疗保险系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着科技的飞速发展和人口老龄化的加剧,医疗保险系统面临着前所未有的挑战与机遇。传统医疗保险管理方式依赖于人工审核与纸质记录,不仅效率......
  • python+flask计算机毕业设计基于微信小程序的河南省美食分享平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在移动互联网时代,智能手机和社交媒体已成为人们日常生活不可或缺的一部分。微信小程序作为腾讯推出的一种轻量级应用形态,凭借其无需安装、......
  • python+flask计算机毕业设计基于微信小程序的网络文学管理平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的迅猛发展,网络文学已成为当代文化生活中不可或缺的一部分,它不仅丰富了人们的阅读体验,还促进了文学创作的多元化与普及化。然而......
  • Python不同方式正倒序遍历的时间开销
    fromtimeitimporttimeitli=[iforiinrange(1000000)]deffor_loop(n):#使用for直接遍历ret=0foriinli:ret=li[i]deffor_loop_enumerate(n):#使用enumerate进行遍历ret=0foridx,iinenumerate(li):re......
  • 【入门岛·第2关】python基础
    目录Python实现wordcountVscode连接InternStudiodebug笔记Python实现wordcountimportstringdefwordcount(text):#去掉标点符号,并将文本转换为小写text=text.translate(str.maketrans('','',string.punctuation)).lower()#按空格分割文本为单词......
  • Anaconda的使用命令,方便python的管理
    pythonpython是世界上最好的编程语言(有杠精,你就对。)python的领域涉及了AI,大数据,网络爬虫,运维,开发等等方面。python的环境由解释器和包组成。1、python的解释器Python解释器是Python环境的本体,也就是python.exe文件。我们需要在环境变量的路径中将python.exe所在的目录添加上,这......
  • python--数据处理分析模块pandas
    一、什么是pandas?Pandas是基于Numpy的一套数据分析工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据......
  • 头歌实践教学平台 Python程序设计 实训答案(三)
    第七阶段文件实验一文本文件的读取第1关:学习-Python文件之文本文件的读取任务描述本关任务:使用open函数以只写的方式打开文件,打印文件的打开方式。相关知识为了完成本关任务,你需要掌握:文本文件;open函数及其参数;文件打开模式;文件对象常用属性;关闭文件close......