2010-02-05 13 views
8

Ho un array 2d, vorrei impostare una colonna su un valore particolare, il mio codice è sotto. È questo il modo migliore in Python?Python - il modo migliore per impostare una colonna in un array 2d su un valore specifico

rows = 5 
cols = 10 

data = (rows * cols) *[0] 
val = 10 
set_col = 5 

for row in range(rows): 
    data[row * cols + set_col - 1] = val 

Se voglio impostare un numero di colonne per un particolare valore, come potrei estendere questo

Vorrei utilizzare la libreria standard di Python solo

Grazie

+6

So che si desidera solo la libreria standard, ma NumPy è stato fatto per questo. – telliott99

risposta

11

Una soluzione migliore sarebbe:

data = [[0] * cols for i in range(rows)] 

Per i valori di cols = 2, rows = 3 otterremmo:

data = [[0, 0], 
     [0, 0], 
     [0, 0]] 

Quindi è possibile accedervi come:

v = data[row][col] 

Che porta a:

val = 10 
set_col = 5 

for row in range(rows): 
    data[row][set_col] = val 

o il più Pythonic (grazie J.F. Sebastian):

for row in data: 
    row[set_col] = val 
+5

Non è necessario utilizzare indici di riga espliciti: 'per riga nei dati: \ n riga [colonna_indice] = valore' – jfs

0

C'è nulla di intrinsecamente sbagliato nel modo in cui stai usando, tranne che sarebbe più chiaro nominare la variabile set_col rispetto a set_row dato che stai impostando una colonna.

Quindi impostare un numero di colonne, basta avvolgerlo con un altro ciclo:

for set_col in [...columns that have to be set...] 

Una preoccupazione, però: la matrice 2D è insolito in quanto è confezionato in un array 1D (Python in grado di supportare le matrici 2D tramite liste di liste pure), quindi vorrei avvolgere tutto con metodi o funzioni.

+0

Thnks eli, ho corretto che – mikip

0

Nel tuo caso righe e le colonne sono probabilmente intercambiabili, vale a dire che è questione di semantica quale è quale. Se questo è il caso, allora si potrebbe rendere le colonne di occupare sequenza di celle a data lista, e poi azzerare utilizzando solo:

data[column_start:column_start+rows] = rows * [0] 
0

una precedente risposta lasciati fuori un range, così si potrebbe provare la seguente:

cols = 7 
rows = 8 

data = [[0] * cols for i in range(rows)] 

val = 10 
set_col = 5 

for row in data: 
    row[set_col] = val 

per estendere questo numero a un numero di colonne in cui è possibile memorizzare il numero di colonna e il suo valore in un dict. Quindi, per impostare Colum da 5 a 10 e la colonna 2-7:

cols = 7 
rows = 8 

data = [[0] * cols for i in range(rows)] 

valdict = {5:10, 2:7} 

for col, val in valdict.items(): 
    for row in data: 
     row[col] = val 

Scambiare le righe e le colonne, come suggerito in un'altra risposta, rende questo un po 'più semplice:

cols = 7 
rows = 8 

data = [[0] * rows for i in range(cols)] 

valdict = {5:10, 2:7} 

for col, val in valdict.items(): 
    data[col] = [val] * rows 
26

NumPy pacchetto fornisce potenti N- oggetto array dimensionale.Se data è un array numpy poi per impostare set_col colonna val valore:

data[:, set_col] = val 

Esempio completo:

>>> import numpy as np 
>>> a = np.arange(10) 
>>> a.shape = (5,2) 
>>> a 
array([[0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7], 
     [8, 9]]) 
>>> a[:,1] = -1 
>>> a 
array([[ 0, -1], 
     [ 2, -1], 
     [ 4, -1], 
     [ 6, -1], 
     [ 8, -1]]) 
+0

Ho mantenuto la risposta nei limiti della libreria standard, ma Devo dire che questo è il modo giusto per fare qualsiasi uso non banale di array. –

+0

In particolare, è possibile eseguire facilmente un'assegnazione a più colonne. Ad esempio, a [:, [0,2]] + = [3,5] – telliott99

Problemi correlati