Wie multipliziere ich zwei Tabellen miteinander?Ich habe eine Big-Data-Tabelle und eine Normalisierungsfaktortabelle.
Die Datentabelle sieht so aus:
| AUSWEIS | Typ | Parameter1 | Parameter2 | Parameter3 |
| 01 | 1 | Daten | Daten | Daten |
| 02 | 1 | Daten | Daten | Daten |
| 03 | 2 | Daten | Daten | Daten |
| 04 | 2 | Daten | Daten | Daten |
Die Tabelle der Normalisierungsfaktoren sieht folgendermaßen aus:
| Typ | Parameter1 | Parameter2 | Parameter3 |
| 1 | Normalisierungsfaktor1 | Normalisierungsfaktor2 | Normalisierungsfaktor3 |
| 2 | Normalisierungsfaktor4 | Normalisierungsfaktor5 | Normalisierungsfaktor6 |
Wie kann ich die erste Tabelle basierend auf Typ und Parameter mit der zweiten Tabelle multiplizieren und eine neue Tabelle wie diese erhalten:
| AUSWEIS | Typ | Parameter1 | Parameter2 | Parameter3 |
| 01 | 1 | Daten*Normalisierungsfaktor1 | Daten*Normalisierungsfaktor2 | Daten*Normalisierungsfaktor3 |
| 02 | 1 | Daten*Normalisierungsfaktor1 | Daten*Normalisierungsfaktor2 | Daten*Normalisierungsfaktor3 |
| 03 | 2 | Daten*Normalisierungsfaktor4 | Daten*Normalisierungsfaktor5 | Daten*Normalisierungsfaktor6 |
| 04 | 2 | Daten*Normalisierungsfaktor4 | Daten*Normalisierungsfaktor5 | Daten*Normalisierungsfaktor6 |
Meine Rohdatentabelle ist sowohl in den Zeilen als auch in den Spalten riesig, daher möchte ich eine schnelle Lösung.
Vielen Dank.
Erweiterte statistische ModellierungVerbraucher- und MarktforschungMassenanpassungQualitäts- und VerfahrenstechnikBetreff: Wie multipliziere ich zwei Tabellen miteinander?Hier ist ein Beispiel
mat1 = [ 1 2 3, 4 5 6, 7 8 9, 10 11 12];
mat2 = [1 2 3 4, 5 6 7 8, 9 10 11 12];
finalMat = mat1 * mat2;
Hier ist ein Beispiel, bei dem sich die Daten in Datentabellen befinden
names default to here(1);
dt1 = data table("one");
dt2 = data table("two");
finalMat=dt1[0,0]*dt2[0,0];Betreff: Wie multipliziere ich zwei Tabellen miteinander?Hallo
Ich muss zwei Matrizen multiplizieren, zum Beispiel ist die erste eine 3X4-Matrix und die zweite eine 4X2-Matrix. Kann jemand vorschlagen, wie diese Matrixmultiplikation in JMP Pro 16 durchgeführt werden kann?
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Vielen Dank für die Aktualisierungen. Ich habe es versucht und es funktioniert mit einem Testdatensatz. Allerdings stoße ich auf Leistungsprobleme, auf die eine andere Person hingewiesen hat. Deshalb habe ich seine Antwort als die beste Lösung akzeptiert.
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Hallo,
Ich habe mir das angeschaut und eine Leistungsgrenze festgestellt, sobald die Tabelle in die Nähe Ihrer Größe kam (eigentlich schon lange davor). Ich konnte die Dinge ein wenig verbessern, als ich anfing, die Tabelle in „Blöcken“ von etwa 10 KB zu verarbeiten Zeilen mal 1K Spalten. Man könnte mit der Größe experimentieren, um herauszufinden, was am besten funktioniert, aber diese Abmessungen schienen gut zu funktionieren.
Diese Methode erstellt keine neue Tabelle, sondern überschreibt das Original. Sie sollten also das Original speichern und das Ergebnis dann unter einem anderen Namen speichern.
Das folgende Skript geht von einigen Annahmen aus, da es lediglich das Gesamtkonzept veranschaulichen soll:
- Die entsprechenden Spalten sind in jeder Tabelle in derselben Reihenfolge.
- Für p Parameter hat die Haupttabelle p+2 Spalten und die Faktortabelle hat p+1 Spalten. In beiden Tabellen gibt es keine weiteren Spalten.
Das Tatsächliche wird bearbeitet Die Zeit für eine Tabelle mit 1 Million Zeilen und tausend Spalten betrug etwa 40 Sekunden ... die Verarbeitung jedes „Blocks“ dauerte etwa 0,3 bis 0,4 Sekunden.
Der Teil des Tischaufbaus, um die Tische, die Sie haben, nachzuahmen, hat eine Weile gedauert ... wahrscheinlich ein paar Minuten. Derzeit ist das Skript für eine kleinere Tabelle eingestellt. Ändern Sie die Zeilen unter dem Kommentar „//Tabelleneinstellungen“, um dies zu ändern.
Der Code ist weder elegant noch kompakt, aber er läuft schneller als alles andere, was ich mir vorstellen konnte (einschließlich der Verwendung einer elementweisen Multiplikation für den gesamten Block auf einmal ... aus irgendeinem Grund dauerte die Iteration über die Spalten etwa die Hälfte der Zeit. ) Ich habe Craiges formelbasierten Ansatz allerdings nicht ausprobiert.
Die anfängliche Sortierung ist erforderlich, um zu verhindern, dass Zeilen mit where() abgerufen werden müssen (wenn Sie dies tun müssen, verlangsamt es die Arbeit erheblich).
Prost,
Brady
Names Default To Here( 1 );
//set limits on block size
blockRowLimit = 1e4;
blockColLimit = 1e3;
// table setup
rowsdt1 = 1e4;
colsdt1 = 1e2;
dt1 = As Table( (1 :: rowsDt1)` || J( rowsDt1, 1, Random Integer( 1, 2 ) ) || J( rowsdt1, colsdt1, Random Uniform() ), <<INVISIBLE></INVISIBLE>
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Die Schleife ist nicht einfach; Ich denke, das wird es schaffen:
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
originalColumns = dataDT<<GETCOLUMNNAMES></GETCOLUMNNAMES>
- Erfassen Sie die ursprünglichen Spalten, bevor Sie die ausgeblendeten Spalten mit einer virtuellen Verknüpfung hinzufügen
- Erstellen Sie den Ausdruck e mit \!", um die eingebetteten Anführungszeichen zu maskieren
- Verwenden Sie write() zum Debuggen Ihrer Arbeit, nicht zum Drucken
- <
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Vielen Dank, es funktioniert mit einem kleinen Datensatz. Aber ich habe Millionen von Zeilen in Tabelle 1 und nur zwei Zeilen in Tabelle 2. Deshalb möchte ich vermeiden, eine weitere große Tabelle zu erstellen. Wenn ich keine bessere Lösung finde, werde ich diese Methode ausprobieren.
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Danke für Ihre Antwort. Allerdings habe ich viele Spalten und die Spaltennamen sind kompliziert. Deshalb möchte ich eine for-Schleife schreiben, um neue Spalten zu erstellen. Können Sie diese Aussage näher erläutern?
Formula( :"parameter1[Type]"n * :parameter1 )
Ich denke darüber nach, eine for-Schleife wie diese zu schreiben:
</CODE></PRE><PRE class="lia-code-sample language-markup"><CODE>colnames = dataDT << Get Column Names();
nc = ncols(dataDT);
DT = New Table("normalized", New Column("ID", values(dataDT:ID << get values)),
New Column("Type", values(dataDT:Type << get values)));
For(i = 3, i<= nc, i++,
DT << New Column( char( colnames[3]), Numeric, "Continuous", Format( "Best", 12 ), Formula( XXXX ) ));Aber ich weiß nicht, wie ich die Formel richtig konstruieren soll . Es gibt mir ständig Fehler. Kannst du mir helfen?
Danke schön.
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Und wenn Sie die Formeln nicht benötigen, können Sie eine elementweise Multiplikation von Matrizen in Betracht ziehen, die möglicherweise „besser“ ist oder auch nicht. Auf meinem MacBook dauerte der folgende Code etwa 15 Sekunden.
NamesDefaultToHere(1);
nr = 10000; // Number of rows
nc = 10000; // Number of Columns
dt1 = AsTable(J(nr, nc, RandomInteger(1, 20)));
dt2 = AsTable(J(nr, nc, RandomUniform(0, 1)));
m1 = dt1 << getAsMatrix;
m2 = dt2 << getAsMatrix;
dtFinal = AsTable(m1 :*</img> m2);
Betreff: Wie multipliziere ich zwei Tabellen miteinander?Sie könnten eine virtuelle Verknüpfung und Formelspalten verwenden.
Virtual join adds the blue and gold keysVirtual join adds the blue and gold keysDurch den virtuellen Beitritt werden die blauen und goldenen Schlüssel hinzugefügt
Sie können sie interaktiv oder mit JSL verknüpfen.
Möglicherweise werden JMP16-Namen mit dem verwendet :"parameter3[Typ]"n Syntax; Möglicherweise benötigen Sie einen Namen( „parameter3[Typ]“ ) stattdessen.
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
// join the tables
factorDT:type << Set Property( "Link ID", 1 );
dataDT:type << Set Property( "Link Reference", Reference Table( "factor.jmp" ) );
// add formula columns
dataDT << New Column( "p 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter1[Type]"n * :parameter1 ) );
dataDT << New Column( "p 2", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter2[Type]"n * :parameter2 ) );
dataDT << New Column( "p 3", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter3[Type]"n * :parameter3 ) );
// force the evaluation to complete
dataDT<<RUNFORMULAS></RUNFORMULAS>