2016-05-09 8 views
2

私は291 * 291の行列を持ち、値(0,1)、(1,2)、(2,3)....(n-1、n)だけを自動的に取得したいと思います。ループや関数を使って簡単に行う方法はありますか?'numpy.ndarray'オブジェクトは、対角行列を取得するときに呼び出し可能ではありません。

行列は、データ・ベースのテキスト間のコサイン類似度:

bodies = [d['body'] for d in data] 
tfidf = vectorizer.fit_transform(bodies) 

matrix =(tfidf * tfidf.T).A 

私はベクトルを作成したいので、これは私がそれを行うにしようとしています方法です:

vector = [] 
for i in range(len(data) -1): 
    vector.append(matrix(i, i+1)) 

しかし、次のエラーが表示されます。

TypeError: 'numpy.ndarray' object is not callable 

修正方法はありますか?

+0

あなたのコード内の 'matrix'は何ですか?定義を表示 – Leva7

+1

配列をインデックス化するには、行列[i、i + 1] 'を使用します。 – gboffi

+1

最後の行で 'vector.append(matrix [i、i + 1])'を試してください。あなたのエラーメッセージからnumpy配列。括弧は関数の引数であり、括弧[]は要素です。 –

答えて

4

あなたの行列が正方形であるとして、あなたは1の正のオフセットは、行列の主対角上の対角1を取得し、ご希望の値

mat.diagonal(offset = 1) 

を取得するために1のオフセットとnumpy.diagonalを使用することができます。


ミニデモ

mat = numpy.ones((3,3)) 
mat[0,1] = 2 
mat[1,2] = 3 
print(mat.diagonal(offset = 1)) 

出力:

[ 2. 3.] 
+1

これは方法クリーナーです:) – AKS

+0

素晴らしい答え@ドンキーコング。最後の質問ですが、ベクトルを単一の列(互いに下にある用語)として取得したい場合は、それを行う簡単な方法はありますか? –

+0

「列として取得する」という意味は本当に分かりませんが、配列から列ベクトルを作成したり、列として非常に簡単に印刷することができます。 – miradulo

1

マトリックスの添え字では角かっこを使用し、角かっこは使用しません。 matrix[i, i+1]が必要です。

関連する問題