我已经在 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
我已经在 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
正如文档所解释的,numpy.dot
仅将两个矩阵相乘。第三个可选参数是一个用于存储结果的数组。如果要将三个矩阵相乘,则需要调用dot
两次:
numpy.dot(numpy.dot(phi, P), phi.T)
请注意,数组有一个dot
方法与 做相同的事情numpy.dot
,这可以使事情更容易阅读:
phi.dot(P).dot(phi.T)
phi.T
与phi.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.]])
错误消息指出它无法执行的原因可能有 3 个np.dot(phi, P, out=phi.T)
:
“必须具有正确的类型”:在第一个示例中可以,因为 P 和 phi 的所有元素都是浮点数。但与评论中提到的另一个示例不同,其中 c[0,0] 元素是浮点数,但输出数组希望在所有位置都是整数,因为“a”和“b”都包含整数。
"nr dimensions":2x2 是输出数组的预期维度,所以问题绝对不在于维度。
“必须是 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
...