【问题标题】:How to get all elements of 2D array by slice in python如何在python中通过切片获取二维数组的所有元素
【发布时间】:2016-06-26 14:49:08
【问题描述】:

我想将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 怎么办?

【问题讨论】:

    标签: python arrays slice


    【解决方案1】:

    这里有一些缺陷。

    首先:迭代器赋值

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

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

    二:列表引用列表

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

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

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

    第三:列表切片/硬拷贝

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

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

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

    最后:你想要什么

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

    的所有元素设置为1

    G[0] = [1] * 101
    

    的所有元素设置为1

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

    【讨论】:

    • 惊人的答案!最让我困惑的是你在第二部分解释的原因。再次感谢!
    【解决方案2】:

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

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

      【讨论】:

      • 所以我们不能使用 slice 来给列表赋值。明白了,谢谢!
      【解决方案4】:

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

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

      【讨论】:

      • 您好!我想我理解为什么 G[1][:]G[:][1] 不包含元素 G[2][2]G[3][4] 但我得到了一个全部 1 数组。是不是因为“外部列表 G 中的每个条目都是对同一列表的引用”。如你所说?
      猜你喜欢
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2020-03-03
      • 2020-06-30
      • 1970-01-01
      相关资源
      最近更新 更多