2017-02-19 4 views
0

Ich möchte ein Histogramm der Rohdaten in 784 Dimensionen erhalten. Hier ist mein Code:'numpy.darray' Objekt hat kein Attribut '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() 

Aber es ist etwas nicht in Ordnung:

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' 

Außerdem ist hier die Ziffer Datensätze:

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:] 

Dann, wie kann ich es beheben? Als Python Anfänger bin ich sehr verwirrt von Plotten.

Antwort

0

Ich würde empfehlen, dies zu lesen earlier post und wenn Sie immer noch nicht Ihre Antwort zu diesem Thema finden. Ich hoffe, das wird helfen.

+0

Danke für die Beantwortung. Ich weiß, iteritems() wird für Dictionary nicht array verwendet. Die Funktion def exampleDistance (x1, x2): wird von Prof. gegeben. Sie ließ uns diese Funktion verwenden, um die Entfernung zu berechnen. Ich denke, ich muss die Änderung in exampleDistance (x1, x2) minimieren, aber ich weiß nicht wie? – JennyShen

+0

können Sie versuchen, 'iteritems' mit' items' in Ihrer Funktion zu ändern, ändern Sie es in 'für i, v1 in x1.items()'? –

+0

Angenommen, Sie haben ein Wörterbuch mit Schlüsseln, versuchen Sie 'für i, v1 in enumerate (x1.iteritems(), 1):'. Dies sollte den Trick machen. Hier setzt '1' den Index von 1 ausgehend. –

Verwandte Themen