在Python中初始化二维数组

10

我在Python中初始化2D数组时遇到了问题。我想要一个6x6的数组,我已经执行了以下操作:

arr = [[None]*6]*6

但是当我这样做时:

>>> arr[1][2]=10
>>> arr
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]]

我注意到我只设置了1项,但它在所有行上都被“复制”了。出了什么问题?我认为这与它引用相同的列表有关,但我该如何解决?

我想:

for key, _ in algos.items():
    algoData[key] = []
    for i in range(0,6):
        algoData[key].append([])
        for j in range(0,6):
            algoData[key][i].append(None)

这个代码可以工作,但初始化一个空的6x6数组好像太麻烦了。如果我想要一个10000x10000的数组,那么它将非常低效?

更新内容

我能否初始化一个2D数组的字典?我有一个像这样的字典:

algos = { "FIFO": ..., "LRU": ..., "Random": ... }

我想要像下面这样初始化一个字典:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr }
4个回答

19

@Cameron提供建议,建议你使用NumPy处理数值数据的数组。对于你问题的第二部分,Niklas B.的建议是使用defaultdict是正确的。

还没有解决的问题是为什么[[None]*6]*6的行为很奇怪。

原因是[None]*6创建了一个包含六个None的列表(如你所期望的那样),但是[list]*6并没有创建list的六个独立的副本,而是创建了对同一list引用的六个副本。

习惯用法Python有一节可能更好地解释了这个问题:“其他语言有变量-Python有名称”。.


16

使用列表推导式,你可以这样写:

arr = [[None for x in range(6)] for y in range(6)]

然后你将会得到arr[1][2] = 10按预期工作的结果。这不是一个很常规的事情,你打算使用嵌套列表做什么?可能还有更好的方法。例如,使用numpy包可以使与数组的操作更加容易。


我想要存储数据以便在matplotlib(一个3D曲面图)中使用。 - Jiew Meng
3
在这种情况下,我一定会推荐使用numpy。如果你想看一个例子的话,可以在这个链接里找到。节省自己的工作量,这是一个非常好的包。 - Cameron
那么我需要的代码行就是 lineData = np.empty((dims, length)) 吗? - Jiew Meng
我能否以类似的方式初始化一个二维数组的字典(也许是你回答中的那个)?我更新了我的原始问题。 - Jiew Meng

0
arr = [[None for i in range(6)] for j in range(6)]

arr[1][2] = 10

arr

3
欢迎来到 StackOverflow。请使用提供的格式化工具正确地格式化代码。另外,请确保对您的代码进行一些解释或注释,以便向其他用户适当地解释您的代码。 - Abhishek Bhagate

0
你可以尝试用零初始化一个数组,然后将值推送到相应的索引位置。
black_array = np.zeros((10,10))

返回一个尺寸为10*10的全零黑色数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接