0

我已经在 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

4

3 回答 3

4

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

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

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

phi.dot(P).dot(phi.T)
于 2015-04-02T18:40:31.290 回答
1

phi.Tphi.transpose()(如文档中所述)相同。它基本上是类方法的返回值。因此,您不能将其用作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.]])
于 2015-04-02T18:21:07.687 回答
1

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

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

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

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

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

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

    >>> phi.T.flags
    C_CONTIGUOUS : False
    F_CONTIGUOUS : True
    OWNDATA : False
    ...
于 2017-04-21T20:53:20.657 回答