2010-02-05 104 views
8

我有一个2d数组,我想将列设置为特定值,我的代码如下所示。这是在Python中最好的方式吗?Python - 将2d数组中的列设置为特定值的最佳方法

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 

如果我要列数设置为特定值,我怎么能扩展此

我想用Python标准库只

感谢

+6

我知道你想只有标准库,但numpy的是为这个做。 – telliott99 2010-02-05 13:36:25

回答

11

一个更好的解决办法是:

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

对于cols = 2值,rows = 3我们会得到:

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

然后你就可以访问它:

v = data[row][col] 

导致:

val = 10 
set_col = 5 

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

还是更Python(感谢J.F.塞巴斯蒂安):

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

没有必要使用显式行索引:'用于行中的数据:\ n row [col_index] = value' – jfs 2010-02-05 13:08:20

0

有因为您正在设置一个列,因此您可以更清楚地指定变量set_col而不是set_row

所以设置了一些列的,只是另一个循环包装它:

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

一个问题,虽然:在它的包装在一维数组(Python可以支持通过二维数组的二维数组是不寻常列表的列表),所以我会用方法或函数来包装它。

+0

Thiks eli,我纠正了这个问题 – mikip 2010-02-05 13:06:26

0

在你的情况的行和列可能是可以互换的,即它的语义哪个是哪个的问题。如果是这种情况,那么你可以把列占据细胞的序列中data列表中,然后零它们只使用:

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

较早的答案留给了range,所以你可以尝试以下方法:

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 

将其扩展到您可以存储列号的列数,它的值为dict。所以设定式柱5至10和列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 

交换行和列,如在另一个答案提示,使这稍微简单:

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包提供了强大的N-二维数组对象。如果datanumpy阵列然后set_col列设置为val值:

data[:, set_col] = val 

完整的例子:

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

我把我的答案保留在标准库的范围内,但是我不得不说这是数组的非平凡使用的正确方法。 – 2010-02-05 15:56:51

+0

特别是,您可以轻松地进行多列分配。例如,a [:,[0,2]] + = [3,5] – telliott99 2010-02-05 17:06:57

相关问题