2017-02-19 18 views
0

生の数字データのヒストグラムを784次元で取得したいと考えています。ここで が私のコードです:'numpy.ndarray'オブジェクトには 'iteritems'という属性はありません

import sys,os 
from math import * 
import random 
from numpy import * 
import matplotlib.pyplot as plt 
import datasets 

waitForEnter=False 
def exampleDistance(x1, x2): 
    dist = 0. 
    for i,v1 in x1.iteritems(): 
     v2 = 0. 
     if x2.has_key(i): v2 = x2[i] 
     dist += (v1 - v2) * (v1 - v2) 
    for i,v2 in x2.iteritems(): 
     if not x1.has_key(i): 
      dist += v2 * v2 
    return sqrt(dist) 

def computeDistances(data): 
    #N = len(data) 
    #D = len(data[0]) 
    N, D = data.shape 
    dist = [] 
    for n in range(N): 
     for m in range(n): 
      dist.append(exampleDistance(data[n],data[m])/sqrt(D)) 
    return dist 
Dims = [784] 
#Cols = ['#FF0000', '#880000', '#000000', '#000088', '#0000FF'] 
Cols = ['#FF0000'] 
Bins = arange(0, 1, 0.02) 


plt.xlabel('distance/sqrt(dimensionality)') 
plt.ylabel('# of pairs of points at that distance') 
#plt.title('dimensionality versus uniform point distances') 
plt.title('dimensionality versus digits data point distances') 

for i,d in enumerate(Dims): 
    distances = computeDistances(datasets.DigitData.X) 
    print "D=%d, average distance=%g" % (d, mean(distances) * sqrt(d)) 
    plt.hist(distances, 
      Bins, 
      histtype='step', 
      color=Cols[i]) 
    if waitForEnter: 
     plt.legend(['%d dims' % d for d in Dims]) 
     plt.show(False) 
     x = raw_input('Press enter to continue...') 


plt.legend(['%d dims' % d for d in Dims]) 
plt.savefig('fig.pdf') 
plt.show() 

しかし、間違って何かがある:加え

Traceback (most recent call last): 
    File "HW3.py", line 56, in <module> 
    distances = computeDistances(datasets.DigitData.X) 
    File "HW3.py", line 39, in computeDistances 
    dist.append(exampleDistance(data[n],data[m])/sqrt(D)) 
    File "HW3.py", line 23, in exampleDistance 
    for i,v1 in x1.iteritems(): 
AttributeError: 'numpy.ndarray' object has no attribute 'iteritems' 

は、ここ桁のデータセットは次のとおりです。

class DigitData: 
    Xall,Yall = loadDigitData('data/1vs2.all') 
    N,D = Xall.shape 
    N0 = int(float(N) * 0.5) 
    X = Xall[0:N0,:] 
    Y = Yall[0:N0] 
    Xte = Xall[N0:,:] 
    Yte = Yall[N0:] 

次に、どのように私はそれを修正することができますか? Pythonの初心者として、私はプロットの非常に混乱しています。

答えて

0

私はこのearlier postを読むことをお勧めします。助けてくれることを願っています。

+0

お返事ありがとうございます。私はiteritems()が辞書ではなく配列に使われていることを知っています。しかし、関数def exampleDistance(x1、x2)は教授によって与えられます。私はexampleDistance(x1、x2)の変更を最小限に抑えなければならないと思いますが、どうやってそれを行うのか分かりません。 – JennyShen

+0

'iteritems'をあなたの関数で' items'を使って変更しようとすると、 'for i、v1 in x1.items()'に変更できますか? –

+0

キーを持つ辞書があると仮定して、列挙(x1.iteritems()、1): 'でi、v1のために'を試してください。これはトリックを行う必要があります。ここで '1 'はインデックスを1から始めるように設定しています。 –

関連する問題