ValueError:形状(11,1)和(11,1)不对齐:1(dim 1)!= 11(dim 0)

时间:2019-06-19 14:58:58

标签: python numpy matrix

我正在尝试实现高斯拟合,当我尝试乘以如下所示的矩阵时遇到问题。     为什么我得到这个错误?    我打印结果只是为了验证2个矩阵的乘积,当我这样做时,我得到的矩阵大小相同且值正确。

请帮忙吗?

谢谢

代码

    import numpy as np
    import pandas as pd

    spectre = pd.read_csv('spectre.txt')
    wl = pd.read_csv('longueur_d_onde.txt')
    spectre = spectre -8000
    A = wl.iloc[185:196,0]
    B = spectre.iloc[185:196, 0 ]
    #*******
    sigma = 2565/8192
    mu = A[192]
    A_ = np.transpose(np.matrix(A))
    Mu_ = np.transpose(np.zeros((1,len(A))))
    for i in range(len(A)):
        Mu_[i] = mu

    mu_ = A_-Mu_
    mu_t = np.transpose(mu_)
    for i in range (100):
        #Y = dat/dat[30]
        Y = np.matrix((B/B[192]))
        Yt = np.transpose(Y)
        N = np.exp(-np.power(mu_,2)//(2*sigma**2))
        print(N*np.power(mu_,2)) # when i print this i got the error.

错误

ValueError: shapes (11,1) and (11,1) not aligned: 1 (dim 1) != 11 (dim 0)

2 个答案:

答案 0 :(得分:0)

您可能未使用预期的矩阵乘法类型。 N * np.power(mu_,2))为您提供Hadamard积(或逐元素矩阵乘法)。

如果您要查找真正的矩阵矩阵乘法,则需要使用N.dot(*np.power(mu_,2))N @ np.power(mu_,2)

答案 1 :(得分:0)

没有文件,我无法重新创建您的计算,但是我可以提出一些建议。

A = wl.iloc[185:196,0]
B = spectre.iloc[185:196, 0 ]

AB现在是熊猫系列。

sigma = 2565/8192
mu = A[192]
A_ = np.transpose(np.matrix(A))

np.matrix(A)产生(1,11)形状matrixtranspose将其更改为(11,1)。 A_ = A.to_numpy()将创建(11,)ndarrayA_=np.reshape(A_, (11,1)将使其变成2d,而不会np.matrix超载。

Mu_ = np.transpose(np.zeros((1,len(A))))
for i in range(len(A)):
    Mu_[i] = mu

Mu_是(11,1)matrix,所有插槽中都有mu

mu_ = A_-Mu_

mu_ = A_-mu也可以正常工作。无需制作Mu_mu_A_具有相同的类型和形状。

mu_t = np.transpose(mu_)

无需制作mu_t(形状(1,11))。

我看不到这个循环是干什么的。

for i in range (100):
    #Y = dat/dat[30]
    Y = np.matrix((B/B[192]))
    Yt = np.transpose(Y)

同样,Y = (B/B[192]).to_numpy()就足够了。但是下面没有使用Y

    N = np.exp(-np.power(mu_,2)//(2*sigma**2))

Nmu_(和A_)具有相同的类型和形状

    print(N*np.power(mu_,2)) # when i print this i got the error.

此乘法的目的是什么?结果应该是元素(11,1)乘积,还是(1,1)dot乘积?无论哪种方式,您都不需要2d matrix

我认为您的代码可以简化为:

A_ = A.to_numpy()    # (11,) shape array
mu_ = A_ - mu
N = np.exp(-np.power(mu_,2)//(2*sigma**2))    # still (11,) shape
N*np.power(mu_,2)          # element-wise multiplication (11,) shape
N@np.power(mu_,2)          # dot product, scalar result