2012-11-12 22 views
6

Po prostu chcę utworzyć pustą tablicę 10 * 3 * 2 z Pythonem.Utwórz pustą macierz Python

raz pierwszy pomyślał o tych jeden, ale to nie działa:

parameters = [ [ [] * 2 ]*3 ] * 10 

to daje mi wektor dziesięciu wektorów, z trzema [] elementów w nim:

[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []], 
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]] 

czyli , jeśli chcę uzyskać dostęp do parametrów [0] [0] [1], jestem poza zasięgiem, podczas gdy ja chcę wymiaru 2 dla najgłębszych wektorów wzdłuż trzeciego wymiaru.

wtedy pomyślałem o tym

[ [ [[] * 2] ]*3 ] * 10 

myślałem że [[] * 2] będzie teraz przynieś mi, co chcę, głębszą dwa elementy wektora. I uzyskać

[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]] 

Tak, jak to zrobić lub jak wyjść z tej inicjalizacji?

Kd rgds.

Odpowiedz

17

Polecam użyć Numpy do tego rodzaju rzeczy. Ułatwia dostęp do kolumn lub wierszy. Dla Państwa przypadku użycia zrobiłbyś

import numpy as np 

matrix = np.zeros((2,3,10)) 
second_col = matrix[:,1,:] 

Numpy będzie także lepiej dbać o swoje dane i realizuje wiele algebry macierzy w Fortran lub C, więc będzie dużo szybciej w (możliwe) przyszłość, kiedy robisz multiplikację macierzy i podobieństwa.

6

chciałbym zrobić coś takiego, używając tych list utworzone są różne obiekty (tj innym id()):

In [96]: [ [ [ []*2] for _ in range(3)] for _ in range(10) ] 
Out[96]: 
[[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]], 
[[[]], [[]], [[]]]] 

In [98]: [id(x) for x in lis] #all objects are unique 
Out[98]:  
[151267948, 
 151268076, 
 151268492, 
 151269164, 
 151267276, 
 151265356, 
 151268140, 
 151269036, 
 151265644, 
 151265964] 


In [101]: lis1=[ [ [[] * 2] ]*3 ] * 10 

In [102]: [id(x) for x in lis1] # all objects are same, changing one will change 
            # others as well 
Out[102]: 
[151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188, 
151278188] 
11

Przede wszystkim należy włożyć coś do listy najgłębszej (jak brak). Po drugie, w przypadku korzystania z mnożenia na liście najbardziej zewnętrznej replikuje referencje do listy wewnętrznej, więc po zmianie jednego elementu, można też zmienić ten element we wszystkich innych list:

>> parameters = [ [ [None] * 2 ]*3 ] * 10 
>> print parameters 
[[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]], 
[[None, None], [None, None], [None, None]]] 
>> parameters[0][0][1]=1 
>> print parameters 
[[[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]]] 

Dlatego należy raczej używać wyrażeń listowych:

>> parameters=[[[None for i in range(2)] for j in range(3)] for k in range(10)] 

jednak, polecam użyć numpy jak zasugerował w jednym z innych odpowiedzi.

4

Oto jeden z problemów z tym, co robisz.

Załóżmy, że tworzysz tablicę, tak:

>>> l = [ [ [[] * 2] ]*3 ] * 10 
>>> l 
[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]] 

Wygląda dobrze do tej pory. Ustawmy coś w tablicy.

>>> l[0][0][0] = 2 
>>> l 
[[[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]]] 

Woah! Ustawiliśmy w nim 1 element, ale wszystko zmieniło! Jak to się stało?

Wygląda na to, że mamy 60 obiektów na liście. Jednak faktycznie mamy 60 odniesień do jednego obiektu listy. Zmień jeden, zmień wszystkie.

TL; DR: Nie należy używać operatora mnożenia na liście list.

Powiązane problemy