2017-11-15 4 views
1

ペアワイズ分操作の合計を実施するための効率的な方法、すなわち:numpyの:それは二つの行列の間の積の和を行うのは簡単です

A = np.random.randn(100, 64) 
B = np.random.randn(64, 100) 
G = np.dot(A, B) 

ベクトル間のペアワイズ分の合計を行うには、同様のアプローチがありますか?

非効率的なアプローチが行うことです。だから私のようなものを探しています

# For each row, col vector i,j in A and B respectively 
for i in range(A.shape[0]): 
    for j in range(B.shape[1]): 
     G[i, j] = np.minimum(A[i], B[:,j]).sum() 

G = np.dot(A, B, operation=np.minimum)

目標は、ループのスローを回避し、numpyののの利点を取ることですBLASの実装。

主なユースケースの1つは、ヒストグラムカーネルの共通部分です。例では、この偉大なブログの記事で説明されています http://blog.datadive.net/histogram-intersection-for-change-detection/

答えて

2

ワンストレートフォワードの方法はA3Dと、レバレッジbroadcasting延長するだろう -

np.minimum(A[...,None], B).sum(1) 
+0

これはめちゃくちゃ良いです!唯一の問題はメモリ要件ですが、速度は私が今必要なものです:)。私はそれが疎な行列のためにするのが簡単かどうかを知りたいのですが、別の投稿のために残したいと思っています。ありがとう。 – Curious

+0

@Curiousええ、まあまあ問題は、別のアプローチが必要です。だから、新しいものを投稿することは良い考えかもしれません。 – Divakar

関連する問題