ValueError: формы (7200) и (1,1) не выровнены: 200 (dim 1)! = 1 (dim 0) - PullRequest
1 голос
/ 28 сентября 2019

У меня есть два ndarray x, y форма x (7,200) и форма y (200,1), но когда я использую matmul, я получаю сообщение об ошибке, которое говорит, что форма y равна (1,1)

Я пытался использовать матрицу, а не ndarray, но получил тот же результат

def solve(X,Y):
    x = np.asmatrix(X)
    x = np.transpose(x)
    x = np.insert(x,0,1,axis=1)
    xt = x.T
    xtx = np.matmul(xt,x)
    y = np.asmatrix(Y)
    y = np.transpose(y)
    print('y',y.shape)
    pinv = np.linalg.pinv(xtx)
    print('pinv',pinv.shape)
    print('xt',xt.shape)
    z = np.matmul(pinv,xt)
    print('z',z.shape)
    B = np.matmul(z, y)
    print('B',B.shape)
    return B

('y', (200, 1))
('pinv', (8, 8))
('xt', (8, 200))
('z', (8, 200))
('B', (8, 1))


Traceback (most recent call last):

 File "project1.py", line 79, in <module>
    Z = X*B+resi
  File "/home/yiming/.local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 226, in __rmul__

return N.dot(other, self)

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

1 Ответ

0 голосов
/ 28 сентября 2019

Легче устранять неполадки, печатая формы на каждом шаге:

def solve(X,Y):
    x = np.asmatrix(X);          print(1, x.shape)
    x = np.transpose(x);         print(2, x.shape)
    x = np.insert(x,0,1,axis=1); print(3, x.shape)
    xt = x.T;                    print(4, xt.shape)
    xtx = np.matmul(xt,x);       print(5, xtx.shape)
    y = np.asmatrix(Y);          print(6, y.shape)
    y = np.transpose(y);         print(7, y.shape)
    pinv = np.linalg.pinv(xtx);  print(8, pinv.shape)
    pre_B = np.matmul(pinv,xt);  print(9, pre_B.shape, y.shape)
    B = np.matmul(pre_B, y)
    return B

## OUTPUT:
# 1 (7, 200)
# 2 (200, 7)
# 3 (200, 8)
# 4 (8, 200)
# 5 (8, 8)
# 6 (200, 1)
# 7 (1, 200)
# 8 (8, 8)
# 9 (8, 200) (1, 200)  <-- PROBLEM

РЕШЕНИЕ : транспонировать y перед последним matmul - тогда внутренние размеры согласуются: (8, 200) x (200, 1) -и конечная форма вывода будет (8, 1):

B = np.matmul(np.matmul(pinv,xt), y.T)
return B
...