2010-02-05 6 views
8

Tengo una matriz de 2d, me gustaría establecer una columna para un valor en particular, mi código está debajo. ¿Es esta la mejor manera en Python?Python: la mejor manera de establecer una columna en una matriz de 2d a un valor específico

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 

Si quiero establecer una serie de columnas a un valor particular, ¿cómo podría extender esta

me gustaría utilizar la biblioteca estándar de Python sólo

Gracias

+6

Sé que usted quiere solamente la biblioteca estándar, pero numpy fue hecho para esto. – telliott99

Respuesta

11

Una mejor solución sería:

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

Para los valores de cols = 2, rows = 3 que tendríamos:

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

A continuación, se puede acceder a él como:

v = data[row][col] 

Lo que lleva a:

val = 10 
set_col = 5 

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

O el más Pythonic (gracias J. F. Sebastián):

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

No hay necesidad de utilizar índices explícitos de fila: 'para fila en datos: \ n fila [col_index] = valor' – jfs

0

Hay de no hay nada intrínsecamente incorrecto con la forma en que está usando, excepto que sería más claro nombrar la variable set_col que set_row ya que está configurando una columna.

Así que establece una serie de columnas, simplemente se envuelve con otro bucle:

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

Una de las preocupaciones, sin embargo: la matriz 2D es inusual, ya que está lleno de una matriz de 1D (Python puede soportar matrices 2D a través listas de listas también), así que lo envolvería todo con métodos o funciones.

+0

Thnks eli, he corregido que – mikip

0

En sus filas y columnas de casos son probablemente intercambiables, es decir, que es cuestión de semántica cuál es cuál. Si este es el caso, entonces se podría hacer columnas para ocupar secuencia de celdas en data lista, y luego cero utilizando simplemente:

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

una respuesta anterior dejó un range, lo que podría intentar lo siguiente:

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 

para ampliar esto a un número de columnas, puede guardar el número de columna y su valor en un dict. Así que para establecer Colum 5 a 10 y la columna 2 a 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 

Intercambio de las filas y columnas, como se sugiere en otra respuesta, hace que este un poco más sencillo:

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 paquete proporciona poderosa N- objeto de matriz dimensionalSi data es una matriz numpy a continuación para configurar la columna set_col a val valor:

data[:, set_col] = val 

ejemplo 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

Mantuve mi respuesta en los confines de la biblioteca estándar, pero Tengo que decir que este es el camino correcto a seguir para cualquier uso no trivial de matrices. –

+0

En particular, puede hacer una asignación de varias columnas fácilmente. Por ejemplo, a [:, [0,2]] + = [3,5] – telliott99

Cuestiones relacionadas