Точечный продукт между scipy разреженной матрицей и массивом numpy дает ValueError

Я пытаюсь вычислить точечный продукт между scipy-матрицей синтаксического анализа и массивом numpy.

Сначала я использовал матрицу numpy, которую вы можете увидеть в следующем коде:

def power_iteration(matrix, n):
    b_k = np.random.rand(matrix.shape[1])
    for _ in range(n):
        b_k = np.dot(matrix, b_k)

    return b_k 

Здесь матрица представляет собой матрицу numpy, и ошибки не возникает.

Если вы передаете scipy разреженную матрицу в качестве параметра, возникает следующая ошибка: ValueError: формы (6762,6762) и (1,6762) не выровнены: 6762 (dim 1)! = 1 (dim 0)

я изменился

b_k = np.random.rand(matrix.shape[1])

в

b_k = np.random.rand(matrix.shape[1], 1)

что заставляет скалярное произведение работать, но не возвращает правильную форму b_k. Мне нужна форма: (6762,)

Изменить: до сих пор я пытался изменить вот так:

b_k = np.reshape(b_k, (matrix.shape[1],))

но это преобразует форму (6762, 1) в (1, 6762) вместо (6762,)

Какие-нибудь советы? Спасибо!


person Lucas Belpaire    schedule 20.04.2019    source источник
comment
Практикуйте это с небольшими массивами и матрицами и по одному циклу за раз. Обратите внимание на b_k is - это 1d ndarray или 2d разреженная матрица? Разреженная матрица всегда равна 2d. Что дает точка с такой матрицей?   -  person hpaulj    schedule 20.04.2019
comment
@hpaulj b_k - это 2-мерная матрица с формой (6762, 1) в этом случае. После каждого скалярного произведения b_k по-прежнему имеет форму (6762, 1), что логично. Я пытаюсь преобразовать форму (6762,1) в (6762,) с помощью reshape. Я основываюсь на следующем ответе: stackoverflow.com/questions/17869840/ Но, похоже, это не работает   -  person Lucas Belpaire    schedule 20.04.2019
comment
Каковы type и dtype у b_k после одного скалярного произведения? Если matrix является разреженным, тогда matrix.dot(b_k) и np.dot(matrix.b_k) будут создавать разные объекты. Смешивать разреженный и плотный массив нужно осторожно. И если промежуточная b_k является матрицей np.matrix или sparse, ее нельзя преобразовать в 1d.   -  person hpaulj    schedule 20.04.2019
comment
Я заметил проблему, тип матрицы уже ‹class 'numpy.matrix'›. Я передал это как параметр в функцию итерации мощности: (d * matrix_s + (1 - d) * matrix_t), здесь d - скаляр, а matrix_t - также numpy.matrix. Это означает, что перед первым скалярным произведением b_k является массивом numpy, а после первого - матрицей numpy.   -  person Lucas Belpaire    schedule 20.04.2019


Ответы (1)


Похоже, чтобы использовать np.dot в разреженной матрице, вам нужно сначала преобразовать ее в плотную матрицу с помощью matrix.toarray(). См. Также https://docs.scipy.org/doc/scipy/reference/sparse.html#matrix-vector-product

person Anna Slastnikova    schedule 20.04.2019