首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在广播中按行方式使用numpy matmul

在广播中按行方式使用numpy matmul
EN

Stack Overflow用户
提问于 2021-04-06 14:49:59
回答 1查看 244关注 0票数 0

我有一个3D点的数组(n,3),它们将使用一个3x3旋转矩阵(以nx3x3数组的形式存储)围绕原点旋转。

目前,我只是在使用matmul的for循环中这样做,但我认为这是没有意义的,因为必须有一种更快的广播方式。

当前代码

代码语言:javascript
运行
复制
n = 10
points = np.random.random([10,3])
rotation_matrices = np.tile(np.random.random([3,3]), (n,1,1))

result = []

for point in range(len(points)):
    rotated_point = np.matmul(rotation_matrices[point], points[point])

    result.append(rotated_point)

result = np.asarray(result)

注意:在这个例子中,我只是平铺了相同的旋转矩阵,但在实际情况下,每一个3x3旋转矩阵都是不同的。

我想做什么

我猜,当点云变得非常大时,for循环会变得非常慢,所以一定有某种方式来广播这个消息。我想这么做:

代码语言:javascript
运行
复制
np.matmul(rotation_matrices, points)

其中,row中的每个points被乘以它对应的旋转矩阵。使用np.einsum可能有办法做到这一点,但我找不出签名。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-06 14:55:20

如果您看到医生np.einsum('ij,jk', a, b)matmul的签名。

因此,您可以尝试使用签名的np.einsum

代码语言:javascript
运行
复制
np.einsum('kij,kj->ki', rotation_matrices, points)

测试

代码语言:javascript
运行
复制
einsum = np.einsum('kij,kj->ki', rotation_matrices, points)
manual = np.array([np.matmul(x,y) for x,y in zip (rotation_matrices, points)])
np.allclose(einsum, manual)
# True
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66970990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档