【问题标题】:python np.dot vectorizationpython np.dot矢量化
【发布时间】:2018-08-17 09:04:07
【问题描述】:

在矩阵相乘时,我试图摆脱一些for 循环。 aa 表示3x3 变换矩阵,bb 表示点坐标nx3,其中n 是点数。

与:

aa = np.matrix([[1,2,3],[1,2,3],[1,2,3]])
bb = np.matrix([[1,1,1],[2,2,2],[3,3,3]])

np.tile(aa,(3,1))*bb.ravel().T

我明白了:

ValueError: shapes (9,3) and (9,1) not aligned: 3(dim 1) != 9 (dim 0)

在这种情况下的预期输出将是 long 列矩阵 [[6],[6],[6],[12],[12],[12],[18],[18],[18]]。在这种情况下应该是哪个最终形状3x3:[[6,6,6],[12,12,12],[18,18,18]]

编辑:远离概括描述。 有n 的点数,只有一个3x3 矩阵。这是一个类似的向量化问题:

points = bb
T = aa
pointsNewPos = []

for point in points:
    pointNewPosition = T*point.T
    pointsNewPos.append(pointNewPosition.T)

【问题讨论】:

  • 预期输出是多少?另外,请注意matrix 几乎被认为已弃用,它们鼓励您转向多维ndarray
  • 感谢提醒,不知道。预期输出与使用 for 循环相同。在这种情况下,它将是长列矩阵 [[6],[6],[6],[12],[12],[12],[18],[18],[18]]。最终的形状应该是 3x3:[[6,6,6],[12,12,12],[18,18,18]]。关于结果应该是什么样子的好点,我将其添加到问题中。
  • @ForceBru 我认为对于矩阵,“*”运算符 == np.dot。
  • @c4da,对,我不知何故没有注意到这些实际上是np.matrix,而不是ndarray,哎呀

标签: python vectorization matrix-multiplication


【解决方案1】:

在这种情况下,这至少给出了您想要的输出。如果没有更多信息,很难确保它是通用的。

import numpy as np

aa = np.array([[1,2,3],[1,2,3],[1,2,3]])
bb = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])

result = b.dot(aa.T)

【讨论】:

  • 如果 len(aa) != len(bb) 那么它似乎不起作用。正如我在问题中所写,只有一个转换矩阵,你可以有 n 个点。
  • @c4da 您能否添加一个示例的预期输出,其中 len(aa) != len(bb)。目前还不清楚你想从你的 OP 中得到什么。
  • @user2653663 好的,我已经添加了更具体的问题描述。
  • @c4da 更新了答案。我希望这是你所需要的。t
  • 谢谢它似乎有效,我将其标记为正确答案。
【解决方案2】:

这听起来像是 np.einsum 的工作,它允许您使用输入矩阵的任意维度进行矩阵乘法。

假设您想将bb 的每一行用作列向量,然后将其(以行主要方式)乘以aa,然后试一试:

cc = np.einsum('ij,kj -> ki', bb, aa)

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2021-05-07
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多