В простом векторном умножении матрицы я получаю разные форматы результатов/вывода при использовании матрицы scipy.sparse вместо плотной матрицы. В качестве примера я использую следующую плотную матрицу и вектор:Разница между векторными матрицами между разреженной и плотной матрицей
import numpy as np
from scipy import sparse
mat = np.array([[1, 1, 0, 0, 0], [0, 2, 2, 0, 0], [0, 0, 3, 3, 0], [0, 0, 0, 4, 4]])
vec = np.arange(1, 5)
Для векторного произведения матриц я получаю следующий ожидаемый результат:
vec.dot(mat) # array([ 1, 5, 13, 25, 16])
mat.T.dot(vec) # array([ 1, 5, 13, 25, 16])
mat.T.dot(vec.T) # array([ 1, 5, 13, 25, 16])
Я понимаю, что это не играет роли, если вектор транспонируется или нет. Но когда я заменить матрицу mat
разреженной матрицей mat_sparse
я получить в результате массив разреженных матриц 4x5, содержащих разреженную матрицу, умноженную на каждом компонент вектора, т.е. [1x mat_sparse, 2x mat_sparse, ...]
mat_sparse = sparse.lil_matrix(mat)
vec.dot(mat_sparse) # array([ <4x5 sparse matrix of type '<type 'numpy.int64'>' with 8 stored elements in LInked List format>, ...], dtype=object)
Использования транспонированной матрицы трюка я получаем ожидаемый результат:
mat_sparse.T.dot(vec4.T) # array([ 1, 5, 13, 25, 16])
Может кто-нибудь объяснить, почему это поведение ожидается/требуется? Замена матрицы mat
(которая фактически представляет собой 2D-массив) экземпляром np.matrix(mat
не изменяет результаты.
При замене массива на матрицу, то есть с использованием 'mat2 = np.matrix (np.массив [[1, 1, 0, 0, 0], [0, 2, 2, 0, 0], [0, 0, 3, 3, 0], [0, 0, 0, 4, 4] ])) 'Я получаю матрицу ([[1, 5, 13, 25, 16]]). Поэтому я ожидал бы получить разреженную матрицу при использовании разреженной матрицы, но вместо этого получаю массив разреженных матриц. Использование 'todense()' в моем случае невозможно, так как я использую разреженные матрицы размером примерно 50000 x 50000. – murban