Chcę zdefiniować tablicę dwuwymiarową bez zainicjowanej długości w następujący sposób:
Matrix = [][]
ale to nie działa...
Wypróbowałem poniższy kod, ale jest również nieprawidłowy:
Matrix = [5][5]
Błąd:
Traceback ...
IndexError: list index out of range
Jaki jest mój błąd?
python
matrix
syntax-error
Masoud Abasian
źródło
źródło
Odpowiedzi:
Technicznie próbujesz zaindeksować niezainicjowaną tablicę. Przed dodaniem elementów musisz najpierw zainicjować zewnętrzną listę za pomocą list; Python nazywa to „rozumieniem listy”.
Możesz teraz dodawać elementy do listy:
Zauważ, że macierz ma „y” adres główny, innymi słowy, „indeks y” znajduje się przed „indeksem x”.
Chociaż możesz nazwać je według własnego uznania, patrzę na to w ten sposób, aby uniknąć nieporozumień, które mogłyby powstać podczas indeksowania, jeśli użyjesz „x” zarówno dla wewnętrznej, jak i zewnętrznej listy, i chcesz macierzy nie kwadratowej.
źródło
range
do bezpośredniego utworzenia wewnętrznych list:[range(5) for x in range(5)]
[0] * w
część jest ładna, ale[[0] * w] * h]
spowoduje nieoczekiwane zachowanie. Spróbujmat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
imat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.Jeśli naprawdę chcesz matrycę, lepiej skorzystać z niej
numpy
. Operacje nanumpy
macierzach najczęściej wykorzystują typ macierzy o dwóch wymiarach. Istnieje wiele sposobów tworzenia nowej tablicy; jedną z najbardziej przydatnych jestzeros
funkcja, która pobiera parametr kształtu i zwraca tablicę danego kształtu, z wartościami zainicjowanymi na zero:Oto kilka innych sposobów tworzenia dwuwymiarowych tablic i macierzy (z wyjściem usuniętym ze względu na zwartość):
numpy
zapewnia równieżmatrix
typ, ale nie jest już zalecany do jakiegokolwiek użytku i może zostać usuniętynumpy
w przyszłości.źródło
np.matrix
do jego przedstawienia. Właściwym sposobem przedstawienia macierzy w liczbach liczbowych jest użycie znakuarray
.array
zamiast matryc. Chociaż nie zawsze jest to zalecane, istnieją uzasadnione powody używaniamatrix
- kontekst ma znaczenie.matrix
? Od czasu@
wprowadzenia operatora wydaje się, że istnieje jeden mniejszy powód od napisania tego postu.numpy
dokumenty wskazują teraz, że klasa może być przestarzała i usunięta w przyszłości, więc wyjąłem ją z odpowiedzi.Oto krótsza notacja dotycząca inicjowania listy list:
Niestety, skrócenie tego do czegoś takiego
5*[5*[0]]
nie działa, ponieważ kończy się to 5 kopiami tej samej listy, więc po zmodyfikowaniu jednej z nich wszystkie się zmieniają, na przykład:źródło
[0]*5
?[[0]*5 for _ in range(5)]
z anonimowym licznikiem pętli, z którego nie korzystasz[0]*5
działa dobrze. Teraz rozumiem, dlaczego też[{0}]*8
byłby zły pomysł.Jeśli chcesz utworzyć pustą macierz, poprawna składnia to
A jeśli chcesz wygenerować macierz o rozmiarze 5 wypełnioną 0,
źródło
Jeśli wszystko, czego potrzebujesz, to dwuwymiarowy pojemnik do przechowywania niektórych elementów, możesz zamiast tego wygodnie użyć słownika:
Następnie możesz zrobić:
Działa
1,2
to, ponieważ jest krotką i używasz go jako klucza do indeksowania słownika. Wynik jest podobny do głupiej rzadkiej matrycy.Jak wskazują osa i Josap Valls, możesz również użyć,
Matrix = collections.defaultdict(lambda:0)
aby brakujące elementy miały domyślną wartość0
.Vatsal wskazuje ponadto, że ta metoda prawdopodobnie nie jest bardzo wydajna w przypadku dużych matryc i powinna być stosowana tylko w częściach kodu, które nie mają krytycznego wpływu na wydajność.
źródło
import collections; Matrix = collections.defaultdict(float)
, aby zastąpić niezainicjowane elementy zerami.W Pythonie będziesz tworzyć listę list. Nie musisz wcześniej deklarować wymiarów, ale możesz. Na przykład:
Teraz macierz [0] [0] == 2 i macierz [1] [0] == 3. Możesz także użyć składni zrozumienia listy. W tym przykładzie użyto go dwa razy, aby utworzyć „dwuwymiarową listę”:
źródło
extend
byłoby również pomocne w pierwszym przypadku: jeśli zaczniesz odm = [[]]
, możesz dodać do wewnętrznej listy (rozszerzyć wiersz) za pomocąm[0].extend([1,2])
i dodać do listy zewnętrznej (dodać nowy wiersz) za pomocąm.append([3,4])
, te operacje pozostawiają cię[[1, 2], [3, 4]]
.Przyjęta odpowiedź jest dobra i poprawna, ale zajęło mi trochę czasu, aby zrozumieć, że mogę jej również użyć do stworzenia całkowicie pustej tablicy.
prowadzi do
źródło
Powinieneś zrobić listę list, a najlepszym sposobem jest użycie zagnieżdżonych wyrażeń:
Na twoim
[5][5]
przykładzie tworzysz listę z liczbą całkowitą „5” w środku i próbujesz uzyskać dostęp do jej piątego elementu, co naturalnie podnosi błąd IndexError, ponieważ nie ma piątego elementu:źródło
Skąd taki długi kod, o który też
Python
pytasz?Dawno temu, kiedy nie czułem się dobrze w Pythonie, zobaczyłem odpowiedzi w jednej linii do pisania matrycy 2D i powiedziałem sobie, że nie zamierzam ponownie używać matrycy 2D w Pythonie. (Te pojedyncze wiersze były dość przerażające i nie dawały mi żadnych informacji o tym, co robił Python. Zauważ też, że nie znam tych skrótów.)
Tak czy inaczej, oto kod dla początkującego, który pochodzi z C, CPP i Java
Uwaga dla miłośników i ekspertów Python: Proszę nie głosować, ponieważ napisałem szczegółowy kod.
źródło
Przepisanie do łatwego czytania:
źródło
Posługiwać się:
* 5 dla pierwszego wymiaru działa, ponieważ na tym poziomie dane są niezmienne.
źródło
matrix = [[0]*cols for _ in range(rows)]
Aby zadeklarować macierz zer (jedynek):
na przykład
lub numpy.ones ((x, y)) np
Możliwe są nawet trzy wymiary. ( http://www.astro.ufl.edu/~warner/prog/python.html patrz -> Tablice wielowymiarowe)
źródło
W ten sposób zwykle tworzę tablice 2D w Pythonie.
Uważam tę składnię za łatwą do zapamiętania w porównaniu do używania dwóch pętli for w zrozumieniu listy.
źródło
Korzystam z pierwszego skryptu w języku Python i byłem trochę zdezorientowany przykładem macierzy kwadratowej, więc mam nadzieję, że poniższy przykład pomoże ci zaoszczędzić trochę czasu:
po to aby
źródło
Za pomocą NumPy możesz zainicjować pustą macierz w następujący sposób:
A później dodaj takie dane:
źródło
Czytam pliki rozdzielone przecinkami, takie jak to:
Lista „data” to lista list z danymi indeksu [wiersz] [col]
źródło
Jeśli chcesz myśleć o tym jak o macierzy 2D zamiast zmuszać się do myślenia na podstawie listy list (moim zdaniem bardziej naturalnie), możesz wykonać następujące czynności:
Wynikiem jest lista (a nie tablica NumPy), a poszczególne pozycje można nadpisać liczbami, ciągami znaków i innymi.
źródło
numpy.matrix
równoważnenumpy.zeros
zerom bez listy?Do tego służy słownik !
Możesz zdefiniować klucze i wartości na dwa sposoby:
lub
Wynik:
źródło
Posługiwać się:
Myślę, że NumPy jest właściwą drogą. Powyższe jest ogólne, jeśli nie chcesz używać NumPy.
źródło
za pomocą listy:
za pomocą dict: możesz również przechowywać te informacje w tabeli skrótów, aby szybko wyszukiwać jak
macierz [1] daje wynik w czasie O (1)
* nb : musisz poradzić sobie z kolizją w tabeli skrótów
źródło
Jeśli nie masz informacji o rozmiarze przed rozpoczęciem, utwórz dwie jednowymiarowe listy.
Zapisz cały wiersz na 1. liście. Po zakończeniu dołącz listę 1 do listy 2:
Wynik:
źródło
Uważaj na to krótkie wyrażenie, zobacz pełne wyjaśnienie w odpowiedzi na @ FJ
źródło
Matrix[0], Matrix[1], ..., Matrix[4]
wszystkie wskazują na tę samą tablicę, więc późniejMatrix[0][0] = 3
możesz się spodziewaćMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Będzie szybszy niż:
źródło
[[0]*(L) for i in range(W)]
powinny być[[0]*(L) for _ in range(W)]
ponieważi
nie jest stosowany wszędzieMożesz utworzyć pustą dwuwymiarową listę, zagnieżdżając dwa lub więcej nawiasów kwadratowych lub trzeciego nawiasu (
[]
oddzielonych przecinkiem) za pomocą nawiasów kwadratowych, tak jak poniżej:Załóżmy teraz, że chcesz dodać 1,
Matrix[0][0]
a następnie wpisać:Teraz wpisz Matrix i naciśnij Enter. Dane wyjściowe będą:
źródło
Spróbuj tego:
źródło
Jeśli potrzebujesz macierzy ze wstępnie zdefiniowanymi liczbami, możesz użyć następującego kodu:
źródło
Oto fragment kodu służący do tworzenia macierzy w pythonie:
Proszę zasugerować, jeśli coś przeoczyłem.
źródło