web-dev-qa-db-fra.com

Créer une matrice vide Python

Je veux simplement créer un tableau 10 * 3 * 2 vide avec Python.

J'ai d'abord pensé à celui-ci, mais cela ne fonctionne pas:

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

cela me donne un vecteur de dix vecteurs, avec trois éléments []:

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

c'est-à-dire que si je veux accéder aux paramètres [0] [0] [1] je suis hors limites, alors que je veux une dimension 2 pour les vecteurs les plus intérieurs le long de la troisième dimension.

alors j'ai pensé à ça

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

Je pensais que [[] * 2] m'apporterait maintenant la chose que je veux, un vecteur à deux éléments le plus intérieur. j'obtiens

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

Alors, comment le faire, ou comment échapper à cette initialisation?

Kd rgds.

11
kiriloff

Je vous recommande d'utiliser Numpy pour ce genre de choses. Il facilite l'accès aux colonnes ou aux lignes. Pour votre cas d'utilisation que vous feriez

import numpy as np

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

Numpy prendra également mieux soin de vos données, et il implémente une grande partie de l'algèbre matricielle dans Fortran ou C, donc ça va être beaucoup plus rapide dans le futur (possible) lorsque vous faites une multiplication matricielle et autres.

21
Matti Lyra

Tout d'abord, vous devez insérer quelque chose dans la liste la plus intérieure (comme Aucun). Deuxièmement, lorsque vous utilisez la multiplication dans la liste la plus externe, elle réplique références vers la liste interne, donc lorsque vous changez un élément, vous changez également cet élément dans toutes les autres listes:

>> 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]]]

Par conséquent, vous devriez plutôt utiliser des compréhensions de liste:

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

Cependant, je recommanderais d'utiliser numpy comme suggéré dans l'une des autres réponses.

19
btel

Je ferais quelque chose comme ça, en utilisant ces listes créées sont des objets différents (c'est-à-dire différents 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]
6
Ashwini Chaudhary

Voici l'un des problèmes que vous rencontrez.

Supposons que vous créez un tableau, comme ceci:

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

Semble bien jusqu'à présent. Mettons quelque chose dans le tableau.

>>> 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! Nous y avons placé 1 élément, mais cela a tout changé! Comment est-ce arrivé?

Eh bien, il semble que nous ayons 60 objets de liste. Cependant, nous avons en fait 60 références à un objet de liste. Changez-en un, changez-les tous.

TL; DR: N'utilisez pas l'opérateur multiplier sur une liste de listes.

5
Nick ODell
# Creates an n x n matrix in p
n=int(input())
p=[[[] for x in range(1,10)]for x in range(1,10)]
print(p)
2
V R Haritha