如何在Python中使用“dot”(或“matmul”)函数进行迭代乘法

时间:2016-12-13 15:39:15

标签: python numpy matrix matrix-multiplication

我需要获得多重矩阵乘法的“W”矩阵(所有乘法都会产生列向量)。

from numpy import matrix
from numpy import transpose
from numpy import matmul
from numpy import dot

# Iterative matrix multiplication
def iterativeMultiplication(X, Y):
    W = [] # Matrix of matricial products
    X = matrix(X) # same number of rows
    Y = matrix(Y) # same number of rows
    h = 0
    while (h < X.shape[1]):
        W.append([])
        W[h] = dot(transpose(X), Y) # using "dot" function
        h += 1
    return W

但是,出乎意料的是,我获得了具有各自数据类型的对象列表。

X = [[0., 0., 1.], [1.,0.,0.], [2.,2.,2.], [2.,5.,4.]]
Y = [[-0.2], [1.1], [5.9], [12.3]] # Edit Y column 
iterativeMultiplication( X, Y )

结果:

[array([[37.5],[73.3],[60.8]]), 
array([[37.5],[73.3],[60.8]]),
array([[37.5],[73.3],[60.8]])]

我需要任何方法来获得矩阵转换的数值。

W = matrix(W) # Results in error

使用“matmul”功能是一样的。感谢你的时间。

2 个答案:

答案 0 :(得分:0)

如果要堆叠多个矩阵,可以使用numpy.vstack

W = numpy.vstack(W)

编辑:您的功能,X和Y与您问题中的“结果”列表之间似乎存在差异。但根据您下面的评论,您实际需要的是numpy.hstack(水平堆栈),它会根据您的“结果”列表为您提供所需的3x3矩阵。

W = numpy.hstack(W) 

答案 1 :(得分:0)

当然你会得到一份清单。您将W作为列表初始化,并将相同的计算附加到其中3次。

但是你的3个元素数组对这些数据array([[ 3.36877336],[ 3.97112615],[ 3.8092797 ]])没有意义。

如果我制作Xm=np.matrix(X)等,

In [162]: Xm
Out[162]: 
matrix([[ 0.,  0.,  1.],
        [ 1.,  0.,  0.],
        [ 2.,  2.,  2.],
        [ 2.,  5.,  4.]])
In [163]: Ym
Out[163]: 
matrix([[  0.1,  -0.2],
        [  0.9,   1.1],
        [  6.2,   5.9],
        [ 11.9,  12.3]])
In [164]: Xm.T.dot(Ym)
Out[164]: 
matrix([[ 37.1,  37.5],
        [ 71.9,  73.3],
        [ 60.1,  60.8]])

In [165]: Xm.T*Ym   # matrix interprets * as .dot
Out[165]: 
matrix([[ 37.1,  37.5],
        [ 71.9,  73.3],
        [ 60.1,  60.8]])

您需要编辑问题,同时拥有有效的Python代码(缺少def:)以及与输入匹配的结果。

===============

In [173]:  Y = [[-0.2], [1.1], [5.9], [12.3]] 
In [174]: Ym=np.matrix(Y)
Out[176]: 
matrix([[ 37.5],
        [ 73.3],
        [ 60.8]])

=====================

这次迭代很笨拙:

h = 0
while (h < X.shape[1]):
    W.append([])
    W[h] = dot(transpose(X), Y) # using "dot" function
    h += 1

更多Pythonic方法

for h in range(X.shape[1]):
    W.append(np.dot(...))

甚至

W = [np.dot(....) for h in range(X.shape[1])]