我有一个2d数组,我想将列设置为特定值,我的代码如下。这是python中最好的方法吗?
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标准库
由于
答案 0 :(得分:26)
NumPy包提供了强大的N维数组对象。如果data
是numpy
数组,那么将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]])
答案 1 :(得分:13)
更好的解决方案是:
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
或更多Pythonic(感谢J.F. Sebastian):
for row in data:
row[set_col] = val
答案 2 :(得分:0)
您使用的方式本身没有任何错误,除了因为您设置列而将变量set_col
命名为set_row
会更清楚。
因此设置了多个列,只需用另一个循环包装它:
for set_col in [...columns that have to be set...]
但有一个问题是:你的2D数组很不寻常,因为它包含在一维数组中(Python也可以通过列表列表支持2D数组),所以我会用方法或函数将它们全部包装起来。
答案 3 :(得分:0)
在你的情况下,行和列可能是可以互换的,也就是语义的问题。如果是这种情况,那么您可以使列占据data
列表中的单元格序列,然后使用以下内容将它们归零:
data[column_start:column_start+rows] = rows * [0]
答案 4 :(得分: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
中。所以要设置colum 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