2016-05-17 13 views
0

Matlab(24 x 121)およびラベルファイル(1x 24)で生成された信号の行列を持っています。 ラベルMatlabで生成されたラベル付きの行列からのPythonグラフ

[array(['1-2'], 
     dtype='<U3') array(['1-3'], 
     dtype='<U3') 
array(['1-4'], 
     dtype='<U3') array(['2-2'], 
     dtype='<U3') 
array(['2-3'], 
     dtype='<U3') array(['2-4'], 
     dtype='<U3') 
array(['49-2'], 
     dtype='<U4') array(['49-3'], 
     dtype='<U4') 
array(['49-4'], 
     dtype='<U4') array(['50-2'], 
     dtype='<U4') 
array(['50-3'], 
     dtype='<U4') array(['50-4'], 
     dtype='<U4') 
array(['51-2'], 
     dtype='<U4') array(['51-3'], 
     dtype='<U4') 
array(['51-4'], 
     dtype='<U4') array(['52-2'], 
     dtype='<U4') 
array(['52-3'], 
     dtype='<U4') array(['52-4'], 
     dtype='<U4') 
array(['53-2'], 
     dtype='<U4') array(['53-3'], 
     dtype='<U4') 
array(['53-4'], 
     dtype='<U4') array(['54-2'], 
     dtype='<U4') 
array(['54-3'], 
     dtype='<U4') array(['54-4'], 
     dtype='<U4')] 

とX

[[ 1.31973026 1.04553767 0.98759242 ..., 0.87344433 0.8734996 
    0.88148139] 
[ 1.54466891 1.50167134 1.43233076 ..., 0.71953425 0.72355352 
    0.76595696] 
[ 0.26974139 0.27669694 0.26486576 ..., 0.86765017 0.84838513 
    0.83147331] 
..., 
[ 1.28762992 1.21298643 1.08822084 ..., 0.81903216 0.7559759 
    0.62566092] 
[ 0.96190193 0.97199575 0.93630357 ..., 0.88570213 0.78969704 
    0.69140163] 
[ 1.70054223 1.6876721 1.66986342 ..., 0.90825585 0.92562056 
    0.93568893]] 

私はそれが重量> 0.7であれば、分岐を表示1相関対策の類似性に基づいてグラフを描画し、しないようにしたい:私はそれをロードした後、それがあります。私が使用しているコードは次のとおりです。

import scipy.io 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import cm # Large set of colormaps 
import pandas as pd 
from scipy.cluster import hierarchy 
from sklearn import datasets 
from sklearn import metrics 
from sklearn import cluster 
from scipy.spatial.distance import pdist 
import networkx as nx 
from matplotlib import pyplot as plt 
import pylab 
import networkx as nx 
from matplotlib import pyplot as plt 


o1 = scipy.io.loadmat('out.mat') 
X=(o1['out']) 
print(X) 

o1 = scipy.io.loadmat('labels.mat') 
labels=o1['labels'] 
labels = labels[0] 
print(labels) 
corr=1-np.corrcoef(X) 
print(corr) 
m, n = np.shape(corr) 
G = nx.Graph() 
corr[np.where(corr>0.7)]=0 
for i in range(m): 
    for j in range(n): 
      s=labels[i] 
      b=labels[j] 
      w=corr[i,j] 
      G.add_edge(s,b,weight=w) 
nx.draw(G) 
plt.show() 

私は問題が何であるかを把握することはできませんエラー

Traceback (most recent call last): File "C:/Users/Kristina/Desktop/NOBS/source/grafovi.py", line 36, in G.add_edge(s,b,weight=w) File "C:\Python34\lib\site-packages\networkx\classes\graph.py", line 706, in add_edge if u not in self.node: TypeError: unhashable type: 'numpy.ndarray'

を取得します。

array(['51-3'],dtype='<U4') 

あなたがGraph.add_nodeを呼び出し、それexpects something like this

+1

おそらくsとbはリストで、 'G.add_edge'は何か他のもの(例えばタプル)を望んでいるかもしれません。リストはハッシュできません。すべての不変オブジェクトはハッシュ可能(typleなど)です。 https://docs.python.org/3/glossary.htmlを参照して、 'hashable'を検索します。' G.add_edge'が辞書を作成し、sとbのどちらかをキーとして使用する場合、ハッシュ可能でなければなりません。 – Moritz

答えて

1

あなたのオブジェクトsbは、それぞれ次のように見て、配列のリストあるlabels変数、の要素である

>>> G.add_edge(1, 2, weight=4.7) 

エラーメッセージとMoritz notedの両方として、に渡された変数のいずれか(おそらく両方) sはハッシュ可能ですが、numpy配列はではなく、ハッシュ可能です。

あなたがしようとしていることはまさに私には分かりませんが、グラフ内の各配列の内容('51-3'など)を使用したい場合は、各配列の0番目の要素にアクセスしてください現在の実装ではsbは常に単一要素の配列であるように見えるからです。私は何を意味することは、このに変化している:私はかなり確信しているものの

for i in range(m): 
    for j in range(n): 
      s=labels[i][0] # change here 
      b=labels[j][0] # change here 
      w=corr[i,j] 
      G.add_edge(s,b,weight=w) 

はあなたがループの代わりにG.add_edges_fromを使用する必要があります。また、予期しないエラーや予期しないタイプが発生した場合は、print()type()を使用して、実際の変数が実際のものであるかどうかを判断してください。

+0

それは、このような高速回答のために多くの感謝、動作します! –

+0

@KristinaVakarovフィードバックのおかげで、私は助けることができるとうれしいです:) –

+1

ニースアンダー – Drew

関連する問題