Python Numpy: не удалось передать операнды вместе с формами при создании матрицы

#python #numpy

#python #numpy

Вопрос:

 import numpy as np
def grams(A):
    (m,n) = A.shape
    Q = A
    R = np.zeros((n,n))
    for i in range(0,n-1):
        R[i,i] = np.linalg.norm(Q[:,i])
        Q[:,i] =Q[:,i]/R[i,i]
        R[i,i 1:n] = np.transpose(Q[:,i])*Q[:,i 1:n]
        Q[:,i 1:n] = Q[:,i 1:n 1]-Q[:,i]*R[i,i 1:n]
    R[n,n] = np.linalg.norm(Q[:,n])
    Q[:,n] = Q[:,n]/R[n,n] 
    return Q, R
A = np.array( [[1,1,2],[4,3,1],[1,6,6]] )
print grams(A)
  

Ошибка в строке

 R[i,i 1:n] = np.transpose(Q[:,i])*Q[:,i 1:n]
  

Ошибка

 ValueError:
    operands could not be broadcast together with shapes (3,) (3,2) 
  

Комментарии:

1. В какой строке происходит ошибка? Некоторые пробелы между операторами и запятыми могут сделать ваш код более читаемым.

Ответ №1:

Давайте воссоздадим это в небольшом случае

 In [105]: n=4
In [106]: m,n=2,4
In [107]: Q=np.arange(m*n).reshape(m,n)
In [108]: R=np.zeros((n,n))
  

Итак, для одного шага целью является (3,) слот в R

 In [109]: i=0
In [110]: R[i,i 1:n]
Out[110]: array([ 0.,  0.,  0.])
In [111]: Q[:,i]
Out[111]: array([0, 4])
In [112]: Q[:,i 1:n]
Out[112]: 
array([[1, 2, 3],
       [5, 6, 7]])
  

Один массив равен (m,), другой (m,3). Единственный способ объединить их и произвести (3,) — это использовать a dot (используя последний / единственный dim одного и 2-й последний dim другого):

 In [113]: np.dot(Q[:,i],Q[:,i 1:n])
Out[113]: array([20, 24, 28])
  

Ответ №2:

Asterisk * выполняет поэлементное умножение numpy . Ваш код гласит:

 R[i,i 1:n] = np.transpose(Q[:,i])*Q[:,i 1:n]
  

np.transpose(Q[:,i]) имеет размеры (3, 1) и Q[:,i 1:n] (3, 2) , поэтому их нельзя поэлементно умножать вместе, поскольку размеры не совпадают.

Я подозреваю, что вы можете захотеть умножить np.transpose(Q[:,i]) и Q[:,i 1:n] использовать матричное умножение, в этом случае вы можете использовать numpy.dot следующее:

 R[i,i 1:n] = np.dot(np.transpose(Q[:,i]), Q[:,i 1:n])
  

но размеры также не совпадают для умножения матрицы, поэтому реализация вашего алгоритма, вероятно, где-то перед этой строкой неверна.

Комментарии:

1. Q[:,i] имеет форму (3,) и transpose не изменяет это.