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

How using "dot" (or "matmul") function for iterative multiplication in Python

我需要获得一个 "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"函数也是一样。谢谢你的时间。

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

W = numpy.vstack(W)

编辑:您的函数 X 和 Y 与问题中的 "result" 列表之间似乎存在差异。但是根据您在下面的评论,您实际上要寻找的是 numpy.hstack (水平堆栈),它将根据您的 "result" 列表为您提供所需的 3x3 矩阵。

W = numpy.hstack(W) 

当然你会得到一个列表。您将 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])]