2

我知道要在 Python 中生成一个列表,您可以使用以下内容:

l = [i**2 for i in range(5)]

而不是使用 for 循环,例如:

l = []
for i in range(5):
    l.append(i**5)

有没有办法在不使用这样的 for 循环的情况下做 2D 列表:

map = [[]]

for x in range(10):
    row = []
    for y in range(10):
        row.append((x+y)**2)
    map.append(row)

是否有任何其他替代方法可以在 Python 中表示 2D 数组?

4

3 回答 3

9

在这里也使用列表理解:

>>> [ [(x+y)**2 for y in range(10)] for x in range(10)]
[[0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [1, 4, 9, 16, 25, 36, 49, 64, 81, 100], [4, 9, 16, 25, 36, 49, 64, 81, 100, 121], [9, 16, 25, 36, 49, 64, 81, 100, 121, 144], [16, 25, 36, 49, 64, 81, 100, 121, 144, 169], [25, 36, 49, 64, 81, 100, 121, 144, 169, 196], [36, 49, 64, 81, 100, 121, 144, 169, 196, 225], [49, 64, 81, 100, 121, 144, 169, 196, 225, 256], [64, 81, 100, 121, 144, 169, 196, 225, 256, 289], [81, 100, 121, 144, 169, 196, 225, 256, 289, 324]]
于 2013-06-19T18:16:50.597 回答
2

更有效的方法是使用 numpy.meshgrid()。这里有一个例子:

i = np.arange(1,10)
I,J = np.meshgrid(i,i)
array = (I+J)**2

并且数组具有所需的形式。

您可以比较您的方法和网格网格之间的性能。Meshgrid 是 C 语言实现的,所以速度非常快!

如果您需要数组中的列表,可以使用 array.tolist() 方法。

于 2013-06-20T15:24:22.793 回答
0

你也可以考虑使用numpy来实现 nd 数组,numpy是 Python 的科学计算包。Numpy 数组对象比嵌套列表具有一些优势:

  • nd 数组切片,例如(取自numpy 文档):

    x = np.array([[1, 2, 3], [4, 5, 6]], np.int32) #creates the array
    x[:,1] # returns the first column
    
  • 使用转置、整形和调整大小等方法轻松操作 nd 数组。

  • 轻松实现对数组的数学运算。

当然,这可能比您实际需要的机器更多,因此嵌套列表理解可能足以满足您的目的。

于 2013-06-19T19:27:47.227 回答