Czasami przydatne jest „sklonowanie” wektora wierszowego lub kolumnowego do macierzy. Przez klonowanie mam na myśli konwersję wektora wierszowego, takiego jak
[1,2,3]
W matrycę
[[1,2,3]
[1,2,3]
[1,2,3]
]
lub wektor kolumnowy, taki jak
[1
2
3
]
w
[[1,1,1]
[2,2,2]
[3,3,3]
]
W Matlabie lub oktawie można to zrobić dość łatwo:
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
Chcę to powtórzyć odrętwieniem, ale bezskutecznie
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.]])
Dlaczego pierwsza metoda ( In [16]
) nie działała? Czy jest sposób na wykonanie tego zadania w Pythonie w bardziej elegancki sposób?
python
numpy
linear-algebra
Boris Gorelik
źródło
źródło
repmat
:repmat([1 2 3],3,1)
lubrepmat([1 2 3].',1,3)
repmat
.tile_df
link tutajOdpowiedzi:
Oto elegancki sposób na zrobienie tego w Pythonie:
problem z
[16]
wydaje się być taki, że transpozycja nie ma wpływu na tablicę. prawdopodobnie chcesz zamiast tego matrycę:źródło
(N,1)
zmiany na tablicę -shape przy użyciu.reshape(-1, 1)
)numpy.tile
jak pokazano w odpowiedzi pv .Zastosowanie
numpy.tile
:lub dla powtarzających się kolumn:
źródło
tile
metoda jest 19,5 razy szybsza niż metoda w aktualnie akceptowanej odpowiedzi (przy użyciu metody mnożenia-operatora).(1, 3)
kopiuje tę kolumnę trzy razy, dlatego wiersze wyniku zawierają po jednym odrębnym elemencie.Po pierwsze, zauważ, że w przypadku operacji rozgłaszania numpy zwykle nie jest konieczne powielanie wierszy i kolumn. Zobacz to i to dla opisów.
Ale aby to zrobić, powtórz i newaxis są prawdopodobnie najlepszym sposobem
Ten przykład dotyczy wektora wierszowego, ale zastosowanie go do wektora kolumnowego jest miejmy nadzieję oczywiste. Powtarzanie wydaje się dobrze to przeliterować, ale możesz to również zrobić poprzez mnożenie, jak w swoim przykładzie
źródło
np.repeat
vsnp.tile
?Pozwolić:
Alokacje bez kosztów
Widok nie ponosi żadnej dodatkowej pamięci. Stąd te deklaracje są natychmiastowe:
Przydział przymusowy
Jeśli chcesz wymusić, aby zawartość rezydowała w pamięci:
Wszystkie trzy metody mają mniej więcej taką samą prędkość.
Obliczenie
Wszystkie trzy metody mają mniej więcej taką samą prędkość.
Wniosek
Jeśli chcesz przeprowadzić replikację przed obliczeniem, rozważ użycie jednej z metod „alokacji z zerowym kosztem”. Nie będziesz cierpieć z powodu spadku wydajności wynikającego z „wymuszonego przydziału”.
źródło
Myślę, że używanie transmisji w numpy jest najlepsze i szybsze
Zrobiłem porównanie w następujący sposób
około 15 razy szybciej dzięki transmisji
źródło
None
aby zrobić to samo.Jednym czystym rozwiązaniem jest użycie funkcji produktu zewnętrznego NumPy z wektorem jedynek:
daje
n
powtarzające się wiersze. Zmień kolejność argumentów, aby uzyskać powtarzające się kolumny. Aby uzyskać taką samą liczbę wierszy i kolumn, możesz to zrobićźródło
Możesz użyć
kafelek wygeneruje powtórzenia wektora
a zmiana kształtu nada mu pożądany kształt
źródło
Jeśli masz ramkę danych pandy i chcesz zachować dtypy, nawet kategorie, jest to szybki sposób:
źródło
plony:
źródło