2016-05-18 2 views
1

У меня есть (плотная) матрица n x n x m и разреженный вектор (scipy.sparse) 1 x m. Если мы посмотрим на мою плотную матрицу n x n x m, ее можно было бы интерпретировать как матрицу n x n, а в каждой позиции - вектор m x 1. Теперь я хочу вычислить точечный продукт моего разреженного вектора с каждым из m x 1 плотных векторов в матрице n x n, давая матрицу n x n со всеми этими точечными произведениями.Сложное умножение матрицы

Один из способов сделать это - построить цикл for для цикла через n x n-матрицу, а затем использовать функцию .dot() scipy.sparse для вычисления точечных произведений с каждым вектором в матрице. Тем не менее, я ищу способ полностью выполнить этот расчет в векторе для повышения эффективности. Это возможно? Если нет, то какой самый быстрый способ в Python выполнить цикл через мою n x n матрицу?

+0

Если ваша матрица n * n плотна, то не имеет значения, как вы выполняете цикл, потому что вам нужно вычислить произведение точек с каждым из n^2 элементов. Таким образом, двойной цикл будет работать отлично. –

ответ

5

Вы могли бы сделать вектор плотным и использовать dot или einsum:

ans = arr.dot(vec.A.T) 
# or 
ans = numpy.einsum('ijk,k->ij', arr, vec.A.squeeze()) 

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

ans = arr[...,vec.nonzero()[1]].dot(vec.data) 

для очень больших объемов данных может быть быстрее использовать tensordot вместо dot, потому что это более вероятно, вызвать в функции BLAS:

ans = numpy.tensordot(arr, vec.A.T, 1) 
# or, for a very sparse vec: 
ans = numpy.tensordot(arr[...,vec.nonzero()[1]], vec.data, 1) 
Смежные вопросы