Python中的数组产品

Python中的数组产品,python,arrays,dot-product,Python,Arrays,Dot Product,我在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乘2phi.T与phi.trans

我在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乘2

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

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

>>> g = phi.T
>>> np.dot(phi, P, g)
仍在给出错误。问题似乎在于
转置的结果存储在内存中的方式。
dot
产品的输出参数必须是C-连续数组,但在本例中
g
与此不同。要解决此问题,可以使用
numpy.ascontiguousarray
方法,解决此问题:

>>> g = np.ascontiguousarray(phi.T)
>>> np.dot(phi, P, g)
array([[ 999.,  999.],
       [   0.,  999.]])
正如所解释的,
numpy.dot
只与两个矩阵相乘。第三个可选参数是用于存储结果的数组。如果要将三个矩阵相乘,需要调用
dot
两次:

numpy.dot(numpy.dot(phi, P), phi.T)
请注意,数组有一个
dot
方法,该方法的作用与
numpy.dot
相同,可以使内容更易于阅读:

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

错误消息指出,有3个原因导致它无法执行
np.dot(phi,p,out=phi.T)

  • “必须具有正确的类型”:在第一个示例中,这是可以的,因为p和phi的所有元素都是浮点数。但注释中提到的另一个示例并非如此,其中c[0,0]元素是浮点数,但输出数组希望在所有位置都是整数,因为“a”和“b”都处处包含整数

  • “nr dimensions”:2x2是输出数组的预期维度,因此问题肯定不在于维度

  • “必须是C-数组”:这实际上意味着输出数组必须是C-连续的。有一个非常好的描述,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
        ...
    

    你试过了吗?是的,我仍然有问题。你的问题暂时是-1(a)。您是尝试将三个矩阵相乘,还是尝试将输出保存在转置矩阵上?我将转置矩阵存储在另一个变量(如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)。您将再次遇到该错误。