如何在python中通过切片获取二维数组的所有元素

Spi*_*ike 4 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
Run Code Online (Sandbox Code Playgroud)

比我得到错误,

...
G[1][:] = 1
TypeError: can only assign an iterable
Run Code Online (Sandbox Code Playgroud)

没有 Numpy 我怎么能做到这一点?

jbn*_*dlr 5

这里有一些缺陷。

第一:迭代器赋值

首先,您赋值的左侧产生一个可迭代对象,因此您不能为其分配标量。相反,右侧(在您的情况下1)需要是等长的可迭代对象,例如:

G[0][:] = [0] * 101 # Warning: Copied code from question, still flawed
Run Code Online (Sandbox Code Playgroud)

第二:列表引用列表

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

你想像这样初始化你的列表:

G = [[0] * 101 for x in range(102)]
Run Code Online (Sandbox Code Playgroud)

第三:列表切片/硬拷贝

接下来的事情是,[:]-call 创建了您列表的硬拷贝。所以这里发生的是:

  • G[0][:] 获取 2d 列表的第一列并将其硬拷贝。
  • G[:][0] 硬拷贝整个 2d 列表,然后返回其中的第一列。

你可能希望整个列表复制周围所有的时间,失去其参考,并只对副本的变化。

最后:你想要什么

假设您的第一个维度是指列,而您的第二个维度是指

列的所有元素设置为1

G[0] = [1] * 101
Run Code Online (Sandbox Code Playgroud)

一行的所有元素设置为1

for i in range(102): G[i][0] = 1
Run Code Online (Sandbox Code Playgroud)