#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
не изменяет это.