如何在 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
我想将 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