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

How to get all elements of 2D array by slice in python

我想将 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 我怎么能做到这一点?

您得到的 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)]

首先你创建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]]

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

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

这里有一些缺陷。

第一:迭代器赋值

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

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

其二:列表引用列表

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

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

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

第三:列表切片/硬拷贝

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

  • G[0][:] 获取二维列表的第一列并将其硬拷贝。
  • G[:][0] 硬拷贝整个二维列表,然后 returns 第一列。

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

最后:如你所愿

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

的所有元素设置为1:

G[0] = [1] * 101

的所有元素设置为1:

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