如何在python中逐片获取2D数组的所有元素

时间:2016-03-11 11:16:46

标签: python arrays slice

我想将G[1][0],G[1][1]...G[1][100]G[0][1],G[1][1]...G[100][1]的值设置为1

G = [[0]*101]*101
G[1][:] = 1
G[:][1] = 1

比我收到错误,

...
G[1][:] = 1
TypeError: can only assign an iterable

如果没有Numpy,我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

这里有一些缺陷。

首先:迭代器分配

首先,作业的左侧产生一个可迭代的,因此您无法为其指定标量。相反,右侧(在您的情况下为1)需要是相等长度的可迭代,例如:

G[0][:] = [0] * 101 # Warning: Copied code from question, still flawed

第二:列表参考列表

您可以在线初始化列表。这对于文字列表是可以的,但对于第二个维度将失败,因为它将包含对相同内部列表的101个引用。更改其中的一个元素将对所有其他索引产生影响。

您想要像这样初始化您的列表:

G = [[0] * 101 for x in range(102)]

第三:列出切片/硬拷贝

接下来,[:] - 调用会创建列表的硬拷贝。那么这里发生的是:

  • G[0][:]获取您的2d列表的第一列并进行硬拷贝。
  • G[:][0]硬复制整个2d列表,然后返回第一列。

您可能想要一直复制整个列表,丢失其引用并仅对副本进行更改。

最后:你想要什么

假设您的第一个维度引用,而您的第二个维度引用

的所有元素设置为1

G[0] = [1] * 101

的所有元素设置为1

for i in range(102): G[i][0] = 1

答案 1 :(得分:1)

您得到的TypeError是因为您尝试将int分配给列表。

我能想到的最简单的解决方案是在你想要设置为1的向量长度上进行for循环:

for i in range(len(G[1][:])):
    G[1][i] = 1

编辑: 我测试了这段代码。当您将G实例化为列表的深层副本列表时,它将无法用于您的设置。

实例化矩阵的正确方法是:

 G = [[0 for x in range(101)] for x in range(101)]

答案 2 :(得分:1)

首先,您创建list的方式是错误的

请参阅此question and answer

使用循环:

import pprint
lst = [[0]*10 for n in range(10)]
for i in range(len(lst[0][:])): #Iterating over column of first row
    lst[0][i] = 1
for j in range(len(lst)): #Iterating over row of first column 
    lst[j][0] =1
pprint.pprint(lst)

<强>输出:

[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

答案 3 :(得分:1)

首先,您需要了解[[0]*101]*101的真正含义。 G的类型为list of list,但外部列表G中的每个条目都是对同一列表的引用。见Python list of lists, changes reflected across sublists unexpectedly。大多数情况下,这不是你想要的。

其次,G[1][:]是一个切片,需要右侧的可迭代对象。有多种方法可以实现连续设置所有值,因为您还可以将条目设置为新列表。由于您还需要在不同的行中更改值,因此我建议首先使用for循环。