2016-05-18 6 views
1

私は(密度の高い)行列n x n x mと疎ベクトル(scipy.sparse)1 x mを持っています。 私の密なn x n x m行列を見ると、各位置にm x 1のベクトルを持つn x n行列と解釈できます。ここで、私の疎ベクトルの内積をn×n行列のm×1の密ベクトルのそれぞれと計算し、これらの内積をすべて含むn×n行列を求めたいと思います。複雑な行列の乗算

これを行う1つの方法は、forループを作成してnxn行列をループし、scipy.sparseの.dot()関数を使用して、ドット積を行列の各ベクトルで計算することです。しかし、効率化のためにベクトル化された方法でこの計算を完全に実行する方法を探しています。これは可能ですか?そうでない場合は、nx nの行列をループするPythonの最も速い方法は何ですか?

+0

n * n行列が密な場合は、n^2要素のそれぞれで内積を計算する必要があるため、どのようにループするかは関係ありません。したがって、double forループはうまく動作します。 –

答えて

5

あなたは密ベクトルを作成し、使用することができdotまたはeinsum

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

ベクトルが非常に希薄である場合、それは最初のベクトルにおける非ゼロ要素に対応する配列から項目を選択するために、おそらくworthwileです:

を非常に大規模なデータについては
ans = arr[...,vec.nonzero()[1]].dot(vec.data) 

BLAS関数を呼び出す可能性が高くなりますので、tensordot代わりのdotを使用する方が速いことがあります

ans = numpy.tensordot(arr, vec.A.T, 1) 
# or, for a very sparse vec: 
ans = numpy.tensordot(arr[...,vec.nonzero()[1]], vec.data, 1)