2016-10-03 2 views
0

OK ich denke, das muss eine sehr einfache Sache zu tun sein, aber ich bekomme immer Index-Fehlermeldungen, egal wie ich versuche, dies zu formatieren. Mein Professor bringt uns dazu, einen 1X3-Zeilenvektor mit einem 3x1-Spaltenvektor zu multiplizieren, und ich kann Python nicht dazu bringen, den Spaltenvektor zu lesen. der Zeilenvektor stammt aus den Zellen A1-C1, und der Spaltenvektor stammt aus den Zellen A3-A5 in meiner Excel-Tabelle. Ich verwende das richtige "Format" dafür, wie er es von uns möchte (wenn ich etwas mache, das funktioniert, aber nicht so formatiere, wie er möchte, bekomme ich keinen Kredit.) Der Zeilenvektor liest richtig ein der variable explorer, aber ich bekomme nur einen 2 x 2 spaltenvektor (wobei die erste spalte die 0. Spalte ist und nur Nullen sind, wieder wie er es will), ich bin noch nicht zum Multiplikationsteil gekommen, weil ich Python nicht bekommen kann um den Spaltenvektor korrekt zu lesen. Hier ist der Code:Python zum Lesen eines Spaltenvektors von Excel

import xlwings as xw 
import numpy as np 

filename = 'C:\\python\\homework4.xlsm' 
wb=xw.Workbook(filename) 

#initialize vectors 
a = np.zeros((1+1,3+1)) 
b = np.zeros((3+1,1+1)) 

n=3 

#Read a and b vectors from excel 
for i in range(1,n+1): 
    for j in range(1,n+1): 
     a[i,j] = xw.Range((i,j)).value 
    'end j' 
    b[i,j] = xw.Range((i+2,j)).value 
'end i' 
+0

Sie initialisieren a und b, um die Formen '(2,4)' und '(4,2)', nicht '(1,3)' und '(3,1)' zu haben. Ich bin nicht vertraut mit "xlwings", aber müssen Sie über "i" (und "j") von 1 bis n + 1 (im Gegensatz zu 0 bis n) übergehen? –

+0

Wenn ich die Formen auf (1,3 und (3,1) umschalte gibt es mir Nullwerte, und ich bekomme immer noch den Fehler, wo der Spaltenvektor nach der zweiten Zeile aufhört zu lesen. Mein Professor unterrichtet Python für das erste Semester nachdem ich VBA seit Jahren unterrichtet habe, kann das etwas mit der verschrobenen Art zu tun haben, die er es lehrt? Ich bekomme null Werte, wenn ich versuche, die Form zu ändern – ufstudent1982

+0

Versuchen Sie 'import pdb; pdb.set_trace()' innerhalb Ihrer Schleife hinzuzufügen (nach der 'for j'-Schleife) Dies ist ein Debugger und stoppt das Programm in dieser Zeile an dieser Stelle können Sie Ihre Variablen lesen (zB können Sie' print (a) 'oder' print (b) 'eingeben um zu sehen, was sich in diesen Arrays befindet.Dies hilft Ihnen herauszufinden, ob Sie die Excel-Datei richtig gelesen haben oder nicht.Hinweis: Geben Sie 'c' ein, um bis zur Iteration fortzufahren, oder' n', um die nächste Zeile zu lesen das hilft dir –

Antwort

0

So etwas sollte funktionieren. Die Art und Weise Sie iterieren i und j sind falsch (plus die initialisiert von a und b)

#initialize vectors 
a = np.zeros((1,3)) 
b = np.zeros((3,1)) 

n=3 

#Read a and b vectors from excel 
for i in range(0,n): 
    a[0,i] = xw.Range((1,i+1)).value 
for i in range (0,n) 
    b[i,0] = xw.Range((3+i,1)).value 
0

Denken Sie daran, Python-0 basierte Indexierung und Excel 1-basierte Indizierung.

Dieser Code wird die Vektoren richtig auslesen, und dann können Sie auf numpy "Skalarprodukt" überprüfen, um die Multiplikation zu erzeugen. Sie können die gesamten Vektoren auch sofort ohne Schleife zuweisen.

import xlwings as xw 
import numpy as np 

filename = 'C:\\Temp\\Book2.xlsx' 
wb=xw.Book(filename).sheets[0] 

n=3 

#initialize vectors 
a = np.zeros((1,n)) 
b = np.zeros((n,1)) 

#Read a and b vectors from excel 
for j in range(1,n+1): 
    a[0, j-1] = wb.range((1, j)).value 
    b[j-1, 0] = wb.range((j+3-1, 1)).value 

#Without loop 
a = wb.range((1, 1),(1, 3)).value 
b = wb.range((3, 1),(5, 1)).value 
+0

Dank, das ist genau das, was ich brauchte – ufstudent1982

Verwandte Themen