【问题标题】:Arrays product in PythonPython中的数组产品
【发布时间】:2015-04-02 18:11:22
【问题描述】:

我在 Python 中定义了几个数组,但在计算乘积时遇到问题。

import numpy as np
phi = np.array([[ 1.,  1.],[ 0.,  1.]])
P = np.array([[ 999.,    0.],[   0.,  999.]])
np.dot(phi, P, phi.T)

我得到错误: ValueError: 输出数组不可接受(必须具有正确的类型、nr 维,并且是 C 数组)

但我不知道是什么问题,因为矩阵或数组的大小是 2 x 2

【问题讨论】:

  • 你试过documentation吗?
  • 是的,我还是有问题。
  • 您的问题是-1(暂时)。您是尝试将三个矩阵相乘还是尝试将输出保存在转置矩阵上?

标签: python arrays dot-product


【解决方案1】:

正如documentation 解释的那样,numpy.dot 仅将两个矩阵相乘。第三个可选参数是一个用于存储结果的数组。如果你想将三个矩阵相乘,你需要调用dot两次:

numpy.dot(numpy.dot(phi, P), phi.T)

请注意,数组有一个 dot 方法与 numpy.dot 做同样的事情,这可以使事情更容易阅读:

phi.dot(P).dot(phi.T)

【讨论】:

    【解决方案2】:

    phi.Tphi.transpose() 相同(如docs 中所述)。它基本上是类方法的返回值。因此,您不能将其用作dot 产品的输出存储。

    更新
    这里似乎还有一个额外的问题,如果将转置矩阵保存到新变量中并将其用作输出,则可以看出:

    >>> g = phi.T
    >>> np.dot(phi, P, g)
    

    仍然报错。问题似乎出在transpose 的结果存储在内存中的方式上。 dot 产品的输出参数必须是 C 连续数组,但在这种情况下 g 不是这样。为了克服这个问题,可以使用numpy.ascontiguousarray 方法,它解决了这个问题:

    >>> g = np.ascontiguousarray(phi.T)
    >>> np.dot(phi, P, g)
    array([[ 999.,  999.],
           [   0.,  999.]])
    

    【讨论】:

    • 我将转置矩阵存储在另一个变量(如 g)中,然后我执行了 np.dot(phi, P, g) 但仍然出现错误。所以我想这不是问题。
    • 我敢肯定,它与转置矩阵无关。试试这个: a=np.array([[1,2],[3,4]]) b=np.array([[1,1],[1,0]]) c=np.array([ [1.5,5],[4,1]]),然后尝试 np.dot(a,b,c)。您将再次收到该错误。
    【解决方案3】:

    错误消息指出它无法执行的可能有 3 个原因np.dot(phi, P, out=phi.T)

    1. “必须有正确的类型”:在第一个例子中没问题,因为 P 和 phi 的所有元素都是浮点数。但与 cmets 中提到的另一个示例不同,其中 c[0,0] 元素是浮点数,但输出数组希望在所有位置都是整数,因为“a”和“b”都包含整数。

    2. "nr dimensions":2x2 是输出数组的预期维度,所以问题肯定不在于维度。

    3. “必须是 C 数组”:这实际上意味着输出数组必须是 C 连续的。有一个很好的描述实际上 C 和 F 连续意味着什么:difference between C and F contingous arrays。长话短说,如果 phi 是 C 连续的(默认情况下是),那么 phi.T 将是 F 连续的。

    您可以通过检查标志属性来检查它:

        >>> phi.flags
        C_CONTIGUOUS : True
        F_CONTIGUOUS : False
        OWNDATA : True
        ...
    
        >>> phi.T.flags
        C_CONTIGUOUS : False
        F_CONTIGUOUS : True
        OWNDATA : False
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2022-01-12
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多