Не удалось передать массив ввода из формы (1285) в форму (1285, 5334)

Я пытаюсь следовать примеру кода, представленного в документации для np.linalg.svd , чтобы сравнить термины и сходства документов после SVD на матрице TDM. Вот что у меня есть:

 results_t = np.linalg.svd(tdm_t) results_t[1].shape 

доходность

 (1285,) 

Также

 results_t[2].shape (5334, 5334) 

Поэтому, пытаясь транслировать эти результаты, чтобы создать реальную S матрицу для классического проектного подхода SVD, у меня есть:

 S = np.zeros((results_t[0].shape[0], results_t[2].shape[0]), dtype = float) S[:results_t[2].shape[0], :results_t[2].shape[0]] = results_t[1] 

Эта последняя строка вызывает ошибку:

 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-329-16e79bc97c4b> in <module>() ----> 1 S[:results_t[2].shape[0], :results_t[2].shape[0]] = results_t[1] ValueError: could not broadcast input array from shape (1285) into shape (1285,5334) 

Что я здесь делаю неправильно?

Поэтому в соответствии с сообщением об ошибке целевой

 S[:results_t[2].shape[0], :results_t[2].shape[0]] 

(1285,5334) , а источник

 results_t[1] 

(1285,) .

Поэтому он должен передавать источник в форму, которая соответствует цели, прежде чем она сможет выполнить назначение. То же самое применимо, если вы пытаетесь суммировать два массива с этими формами или умножать их и т. Д.

  • Первый шаг трансляции, чтобы совместить число измерений. Источник 1d, поэтому он должен быть 2d. numpy попробует results_t[1][np.newaxis,:] , производя (1, 1285) .

  • Второй шаг – расширить размеры каждого размера 1, чтобы соответствовать другому. Но этого не может быть здесь – отсюда ошибка. (1285,5334) + (1,1285)?

======

Если вы хотите назначить блок (или все S ), используйте:

  S[:results_t[2].shape[0], :results_t[2].shape[0]] = results_t[1][:,np.newaxis] 

Чтобы присвоить r1 диагонали S , используйте индексирование списка (вместо ломтиков):

 S[range(results_t[1].shape[0]), range(results_t[1].shape[0])] = results_t[1] 

или

 S[np.diag_indices(results_t[1].shape[0])] = results_t[1] 

В этом случае эти ranges должны соответствовать results_t[1] по длине.

(заметьте, глядя на ответ Би Рико, похоже, что правильная интерпретация заключалась в том, что вы на самом деле не пытаетесь транслировать эту команду? Этот ответ показывает, как на самом деле делать трансляцию.)

 X = scipy.zeros((5,4)) X > array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) Y = scipy.arange(5) Y > array([0, 1, 2, 3, 4]) X[:,:]=Y > could not broadcast input array from shape (5) into shape (5,4) , X = scipy.zeros((5,4)) X > array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) Y = scipy.arange(5) Y > array([0, 1, 2, 3, 4]) X[:,:]=Y > could not broadcast input array from shape (5) into shape (5,4) 

Поэтому вместо этого попробуйте

 X[:,:]=Y[:,None] X > array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.]]) 

Вы можете немного лучше понять проблему из следующих

 Z = scipy.arange(4) Z > array([0, 1, 2, 3]) X[:,:]=Z X >array([[ 0., 1., 2., 3.], [ 0., 1., 2., 3.], [ 0., 1., 2., 3.], [ 0., 1., 2., 3.], [ 0., 1., 2., 3.]]) 

Проблема здесь в том, что он убежден, что вы рассматриваете Y (или Z ) как строку массива, в то время как вы пытаетесь поместить его в столбец. Выполнение Y[:,None] основном заставляет его интерпретировать Y как столбец.

Вы используете нарезку, когда вы должны использовать индексацию. Возьмем, к примеру:

 A = np.zeros((4, 5)) end0, end1 = A.shape # These are both true A == A[:, :] A[:, :] == A[:end0, :end1] # To get the diagonal of an array you want to use range or np.arange A[range(end0), range(end0)] == A.diagonal() 

Некоторые другие вещи, которые могут оказаться полезными:

 # If U.shape is (a, b) and S.shape is (b,) U.dot(np.diag(S)) == (U * S) # IF V.shape (b, a) and S.shape is (b,) np.diag(S).dot(V) == (S.reshape(b, 1) * V)