【问题标题】:Why does my matrix vector multiplication in NumPy yield a two dimensional array instead of a one dimensional vector?为什么我在 NumPy 中的矩阵向​​量乘法会产生二维数组而不是一维向量?
【发布时间】:2026-02-19 03:25:02
【问题描述】:

我有一个名为 inverseJ 的矩阵,它是一个 2x2 矩阵 ([[0.07908312, 0.03071918], [-0.12699082, -0.0296126]]),以及一个长度为 2 ([-31.44630082, -16.9922145]) 的一维向量 deltaT。在 NumPy 中,将它们相乘应该再次产生一个一维向量,如this example。但是,当我使用 inverseJ.dot(deltaT) 将它们相乘时,我得到一个二维数组 ([[-3.00885838, 4.49657509]]),其中唯一的元素是我实际要查找的向量。有谁知道为什么我不简单地得到一个向量?非常感谢任何帮助!

整个脚本供参考

from __future__ import division
import sys
import io
import os
from math import *
import numpy as np

if __name__ == "__main__":
    # Fingertip position
    x = float(sys.argv[1])
    y = float(sys.argv[2])
    # Initial guesses
    q = np.array([0., 0.])
    q[0] = float(sys.argv[3])
    q[1] = float(sys.argv[4])

    error = 0.01
    while(error > 0.001):
        # Configuration matrix
        T = np.array([17.3*cos(q[0] + (5/3)*q[1])+25.7*cos(q[0] + q[1])+41.4*cos(q[0]),
                        17.3*sin(q[0] + (5/3)*q[1])+25.7*sin(q[0] + q[1])+41.4*sin(q[0])])

        # Deviation
        deltaT = np.subtract(np.array([x,y]), T)
        error = deltaT[0]**2 + deltaT[1]**2
        # Jacobian
        J = np.matrix([ [-25.7*sin(q[0]+q[1])-17.3*sin(q[0]+(5/3)*q[1])-41.4*sin(q[0]), -25.7*sin(q[0]+q[1])-28.8333*sin(q[0]+(5/3)*q[1])],
                        [25.7*cos(q[0]+q[1])+17.3*cos(q[0]+(5/3)*q[1])+41.4*cos(q[0]),      25.7*cos(q[0]+q[1])+28.8333*cos(q[0]+(5/3)*q[1])]])
        #Inverse of the Jacobian
        det = J.item((0,0))*J.item((1,1)) - J.item((0,1))*J.item((1,0))
        inverseJ = 1/det * np.matrix([  [J.item((1,1)),     -J.item((0,1))],
                                        [-J.item((1,0)),    J.item((0,0))]])
        ### THE PROBLEMATIC MATRIX VECTOR MULTIPLICATION IN QUESTION
        q = q + inverseJ.dot(deltaT)

【问题讨论】:

    标签: python python-3.x numpy vector matrix-multiplication


    【解决方案1】:

    matrix 参与操作时,输出是另一个matrixmatrix 对象是严格线性代数意义上的矩阵。它们总是二维的,即使它们只有一个元素。

    相反,您提到的示例使用数组,而不是矩阵。数组更“松散地表现”。区别之一是删除了“无用”维度,在此示例中生成一维向量。

    【讨论】:

    • 感谢您的澄清!但是,在二维数组上定义矩阵有什么好处呢?
    • @EmielBoss:数学上的严格性,如果你需要它。例如,许多算法是根据 1Xn 向量定义的。在这种情况下,您希望以某种方式确保您的大小不会根据值而改变。然而,在大多数情况下,对于大多数人来说,数组更容易使用。
    • @EmielBoss 看看numpy.matrix vs 2D numpy.ndarray。我同意你的观点,从 lin 代数教科书到 numpy 的翻译并不总是完美的,这是我想说的一种情况。
    【解决方案2】:

    这似乎就是 numpy.dot() 的作用方式。它执行一个简单的数组乘法,由于其中一个参数是二维的,因此返回一个二维数组。 dot() 不是一个聪明的方法,它只是按照我在文档here 中收集到的内容进行的操作,而无需进行完整性检查。请注意,这不是您的代码中的错误,但您必须自己提取内部列表。

    【讨论】:

    • 提取内部列表确实是一种选择,但我仍然想知道为什么在我的特定情况下它的行为是这样的,而它通常返回一个向量就好了。