Manchmal ist es nützlich, einen Zeilen- oder Spaltenvektor in eine Matrix zu "klonen". Mit Klonen meine ich das Konvertieren eines Zeilenvektors wie z
[1,2,3]
In eine Matrix
[[1,2,3]
[1,2,3]
[1,2,3]
]
oder ein Spaltenvektor wie
[1
2
3
]
in
[[1,1,1]
[2,2,2]
[3,3,3]
]
In Matlab oder Oktave ist dies ziemlich einfach:
x = [1,2,3]
a = ones(3,1) * x
a =
1 2 3
1 2 3
1 2 3
b = (x') * ones(1,3)
b =
1 1 1
2 2 2
3 3 3
Ich möchte dies in numpy wiederholen, aber erfolglos
In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
# so far so good
In [16]: x.transpose() * ones((1,3))
Out[16]: array([[ 1., 2., 3.]])
# DAMN
# I end up with
In [17]: (ones((3,1)) * x).transpose()
Out[17]:
array([[ 1., 1., 1.],
[ 2., 2., 2.],
[ 3., 3., 3.]])
Warum In [16]
funktionierte die erste Methode ( ) nicht? Gibt es eine Möglichkeit, diese Aufgabe in Python eleganter zu erfüllen?
python
numpy
linear-algebra
Boris Gorelik
quelle
quelle
repmat
:repmat([1 2 3],3,1)
oderrepmat([1 2 3].',1,3)
repmat
.tile_df
hierAntworten:
Hier ist eine elegante, pythonische Methode:
Das Problem mit
[16]
scheint zu sein, dass die Transponierung keine Auswirkung auf ein Array hat. Sie möchten wahrscheinlich stattdessen eine Matrix:quelle
(N,1)
-Form Array.reshape(-1, 1)
)numpy.tile
wie in der Antwort von pv. Gezeigt .Verwendung
numpy.tile
:oder zum Wiederholen von Spalten:
quelle
tile
Methode für einen Vektor mit 10000 Elementen, die 1000-mal wiederholt wurden, 19,5-mal schneller als die Methode in der aktuell akzeptierten Antwort (unter Verwendung der Multiplikationsoperator-Methode).(1, 3)
kopiert diese Spalte dreimal, weshalb die Zeilen des Ergebnisses jeweils ein einzelnes Element enthalten.Zunächst ist zu beachten , dass mit numpy des Rundfunk ist es in der Regel nicht erforderlich , Zeilen und Spalten - Operationen zu duplizieren. Siehe dies und das für Beschreibungen.
Aber um dies zu tun, sind Wiederholung und neue Achse wahrscheinlich der beste Weg
Dieses Beispiel bezieht sich auf einen Zeilenvektor, aber die Anwendung auf einen Spaltenvektor ist hoffentlich offensichtlich. Wiederholung scheint dies gut zu buchstabieren, aber Sie können es auch wie in Ihrem Beispiel durch Multiplikation tun
quelle
np.repeat
bietet die Verwendung von vsnp.tile
?Lassen:
Kostenfreie Zuweisungen
Eine Ansicht benötigt keinen zusätzlichen Speicher. Somit sind diese Erklärungen augenblicklich:
Erzwungene Zuordnung
Wenn Sie möchten, dass sich der Inhalt im Speicher befindet:
Alle drei Methoden sind ungefähr gleich schnell.
Berechnung
Alle drei Methoden sind ungefähr gleich schnell.
Fazit
Wenn Sie vor einer Berechnung replizieren möchten, sollten Sie eine der "Zero-Cost-Allocation" -Methoden verwenden. Sie werden nicht die Leistungsstrafe der "erzwungenen Zuweisung" erleiden.
quelle
Ich denke, die Sendung in Numpy zu verwenden ist das Beste und schneller
Ich habe einen Vergleich wie folgt durchgeführt
etwa 15 mal schneller mit Broadcast
quelle
None
, um dasselbe zu tun.Eine saubere Lösung besteht darin, die Außenproduktfunktion von NumPy mit einem Vektor von Einsen zu verwenden:
gibt sich
n
wiederholende Zeilen. Ändern Sie die Argumentreihenfolge, um sich wiederholende Spalten zu erhalten. Um eine gleiche Anzahl von Zeilen und Spalten zu erhalten, können Sie dies tunquelle
Sie können verwenden
Kachel erzeugt die Wiederholungen des Vektors
und Umformung gibt es die Form, die Sie wollen
quelle
Wenn Sie einen Pandas-Datenrahmen haben und die d-Typen, auch die Kategorien, beibehalten möchten, ist dies eine schnelle Möglichkeit:
quelle
Ausbeuten:
quelle