2011-01-17 11 views
1

配列の要素の内積を1つおきに取る簡単な方法はありますか? Soは与えられた:配列の他のすべての要素とのすべての要素のドット積

array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

私は結果を取得したいと思い:

array([ 32., 50., 122.]) 

すなわち、 a [0]ドットa [1]、a [0]ドットa [2]、a [1]ドットa [2]である。

私が使っている配列は正方形ではありません。これは単なる例です。

ありがとうございます!

答えて

3
>>> X = scipy.matrix('1 2 3; 4 5 6; 7 8 9') 
>>> X*X.T 
matrix([[ 14, 32, 50], 
     [ 32, 77, 122], 
     [ 50, 122, 194]]) 

これは、あなたが望む以上に多くを提供しますが、それは間違いありません。

それともここ

>>> X = scipy.array([[1,2,3], [4,5,6], [7,8,9]]) 
>>> scipy.dot(X, X.T) 
array([[ 14, 32, 50], 
     [ 32, 77, 122], 
     [ 50, 122, 194]]) 
+0

関心のある要素だけを抽出したい場合は、 'np.dot(X、X.T)[np.triu_indices_from(X、k = 1)]'を実行します。 –

+0

ありがとうジョー、私が使っている配列は正方形ではありませんが。 – Christoph

+1

注: 'triu_indices_from'はNumpy v.1.4.0で新しく追加されました。 Christoph: 'triu_indices(len(X)、k = 1)'を使うことができます。なぜなら 'X * X.T'は常に正方形であるからです。 –

1

あなたがnumpyの使用しているように見えるので:

from itertools import combinations 
import numpy as np 

dot_products = [np.dot(*v) for v in combinations(vectors, 2)] 

が、私はこれをチェックアウトし、私のpythonのインストールで動作するように表示されます。

+1

あなたは、これは純粋なnumpyの実装と比較してどれだけ速く知っていますか?私が使用する配列には約5000-10000の要素が含まれているので、素早くする必要があります。 – Christoph

+1

5k-10kの要素は現代のコンピュータにとって効果的ではありません。 –

+1

@セス・ジョンソン:この場合でも、5k~10k要素でさえカウントされます。すべての組み合わせに対してnp.dotを別々に呼び出すにはあまりにも多くのオーバーヘッドがあります。 np.dotは、ベクトルのすべての組み合わせの間で内積を計算するためにはるかに効率的な方法で利用できます。ありがとう – eat

0

は別のものです:

>>> a = numpy.array([[1, 2, 3], 
...  [4, 5, 6], 
...  [7, 8, 9]]) 
>>> numpy.array([numpy.dot(a[i], a[j]) for i in range(len(a)) for j in range(i + 1, len(a))]) 
array([ 32, 50, 122]) 
関連する問題