簡體   English   中英

如何在python中逐片獲取2D數組的所有元素

[英]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我怎么能這樣做?

這里有一些缺陷。

第一:迭代器分配

首先,賦值的左側產生一個可迭代,因此您無法為其指定標量。 相反,右側(在您的情況下為1 )需要是相等長度的可迭代,例如:

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

第二:列表參考列表

您可以在線初始化列表。 這對於文字列表是可以的,但對於第二個維度將失敗,因為它將保持對同一內部列表的101個引用。 更改其中的一個元素將對所有其他索引產生影響。

您想要像這樣初始化您的列表:

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

第三:列出切片/硬拷貝

接下來的事情是, [:] call會創建列表的硬拷貝。 那么這里發生的是:

  • G[0][:]取你的2d列表的第一列並硬拷貝。
  • G[:][0]硬復制整個2d列表,然后返回第一列。

您可能希望一直復制整個列表,丟失其引用並僅對副本進行更改。

最后:你想要什么

假設您的第一個維度引用了列,而您的第二個維度引用了

列的所有元素設置為1

G[0] = [1] * 101

行的所有元素設置為1

for i in range(102): G[i][0] = 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)]

首先,您創建list的方式是錯誤的

看到這個問題和答案

使用循環:

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列表,意外地反映在子列表中的更改 大多數時候這不是你想要的。

其次, G[1][:]是一個切片,需要右側的可迭代對象。 有多種方法可以實現連續設置所有值,因為您還可以將條目設置為新列表。 由於您還需要在不同的行中更改值,因此我建議使用for循環開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM