2014-10-05 136 views
0

我有這樣多維數組索引和列訪問

[[[ 1 4 4 ..., 952 0 0] 
    [ 2 4 4 ..., 33 0 0] 
    [ 3 4 4 ..., 1945 0 0] 
    ..., 
    [4079 1 1 ..., 0 0 0] 
    [4080 2 2 ..., 0 0 0] 
    [4081 1 1 ..., 0 0 0]] 

[[ 1 4 4 ..., 952 0 0] 
    [ 2 4 4 ..., 33 0 0] 
    [ 3 4 4 ..., 1945 0 0] 
    ..., 
    [4079 1 1 ..., 0 0 0] 
    [4080 2 2 ..., 0 0 0] 
    [4081 1 1 ..., 0 0 0]] 

    ..... 

[[ 1 4 4 ..., 952 0 0] 
    [ 2 4 4 ..., 33 0 0] 
    [ 3 4 4 ..., 1945 0 0] 
    ..., 
    [4079 1 1 ..., 0 0 0] 
    [4080 2 2 ..., 0 0 0] 
    [4081 1 1 ..., 0 0 0]]] 

該陣列具有總共5個數據塊3維陣列。每個數據塊有4081行和9列。

我的問題是關於以數據塊方式訪問列。
我希望能夠索引數據塊,行和列,以及訪問列,並使用if循環做一些工作。我知道如何訪問到列二維數組,如:

column_1 = [row[0] for row in inputfile]

,但我怎麼能訪問列每個數據塊?

我試圖像(inputfile中= 3D上述陣列)

for i in range(len(inputfile)): 
    AAA[i] = [row[0] for row in inputfile] 
    print AAA[2] 

但它說「名稱 'AAA' 沒有定義。我怎樣才能訪問列,爲每個數據塊?我是否需要製作[無]陣列?有沒有其他方式沒有使用空陣列?

另外,如何訪問訪問列的特定元素?像AAA [i] [j] =第i個數據塊,以及第一列的第j行。我還需要使用一個循環來進行按行訪問嗎?

PS)我試圖分析的方式這3D陣列等

for i in range(len(inputfile)):  ### number of datablock = 5 
    for j in range(len(inputfile[i])): ### number of lines per a datablock = 4081 
     AAA = inputfile[i][j]  ### Store first column for each datablocks to AAA 
     print AAA[0]     ### Working as I intended to access 1st column. 
     print AAA[0][1]    ### Not working, invalid index to scalar variable. I can't access to the each elemnt. 

可是這樣,我無法訪問到第一列的各要素,AAA [0]。我如何訪問這裏的每個元素?

我想,也許2指標還不夠,所以我用3 for循環爲:

for i in range(len(inputfile)):    ### number of datablock = 5 
    for j in range(len(inputfile[i])):   ### number of lines per a datablock = 4081 
     for k in range(len(inputfile[i][j])): ### number of columns per line = 9 
      AAA = inputfile[i][j][0] 
      print AAA[0] 

不過,我不能進入到第一列的每一個元素,它說:「invalid index to scalar variable」。此外,AAA包含九個元素,就像

>>> print AAA 
1 
1 
1 
1 
1 
1 
1 
1 
1 
2 
2 
... 
4080 
4080 
4080 
4081 
4081 
4081 
4081 
4081 
4081 
4081 
4081 
4081 

像這樣,每個元素重複9次,這不是我想要的。

我希望在我的分析過程中使用索引,在分析過程中將使用索引作爲元素。我想訪問列,並訪問這個3D數組中的所有索引的每個元素。我怎樣才能做到這一點?

+0

你還沒有定義AAA(並且你沒有填寫數據)。 「inputfile」是你上面顯示的數組嗎?你希望AAA [i]是什麼? – tdelaney 2014-10-06 00:07:22

+0

@tdelaney是的,inputfile是我顯示的數組。共20405行,由5個數據塊組成,每行4081行。我希望AAA [i] [j]成爲第一列,對於每個數據blcok i = 1到5,並且對於每行j = 1到4081. – exsonic01 2014-10-06 00:14:39

+0

@tdelaney我編輯了我的分析代碼。你能給我一個評論嗎? – exsonic01 2014-10-06 17:19:27

回答

1

一個很好的做法,槓桿拉鍊

例如:

>>> a = [1,2,3] 
>>> b = [4,5,6] 
>>> for i in a: 
... for j in b: 
... print i, b 
... 
1 [4, 5, 6] 
1 [4, 5, 6] 
1 [4, 5, 6] 
2 [4, 5, 6] 
2 [4, 5, 6] 
2 [4, 5, 6] 
3 [4, 5, 6] 
3 [4, 5, 6] 
3 [4, 5, 6] 
>>> for i,j in zip(a,b): 
... print i,j 
... 
1 4 
2 5 
3 6 
1

除非你使用類似與NumPy,Python沒有多維數組這樣。相反,您顯示的結構是整數列表列表。 (您選擇的inputfile作爲變量名在這裏引起混淆;這樣的變量通常會包含一個文件句柄,通過迭代可以在每行產生一個字符串,但是我離題了......)

不幸的是,我無法準確理解你想要完成什麼,但是在某一時刻,你似乎想要一個由每一行的第一列組成的列表。這很簡單:

column = [row[0] for block in inputfile for row in block] 

當然,這並不是真正的數學意義上的列,但它可能可能是你想要的。現在

,至於爲什麼你的其他努力都失敗了:

for i in range(len(inputfile)): 
    AAA[i] = [row[0] for row in inputfile] 
    print AAA[2] 

隨着錯誤消息狀態,AAA沒有定義。 Python不會讓你指定一個未定義變量的索引,因爲它不知道該變量是否應該是列表,字典或更奇特的東西。特別是對於列表,它也不會讓您分配給一個尚不存在的索引;相反,使用的appendextend方法爲:

AAA = [] 
for i, block in enumerate(inputfile): 
    for j, row in enumerate(block): 
     AAA.append(row[0]) 
print AAA[2] 

(然而,這並不像列表解析高效以上。)

for i in range(len(inputfile)): ### number of datablock = 5 
    for j in range(len(inputfile)):  ### number of lines per a datablock = 4081 
     AAA = inputfile[i][j]   ### Store first column for each datablocks to AAA 
     print AAA[0]  ### Working as I intended to access 1st column. 
     print AAA[0][1] ### Not working, invalid index to scalar variable. I can't access to the each elemnt. 

有一個範圍在一個明顯的問題在第二行中,並且多次查找inputfile [i]時效率低下,但真正的問題在最後一行。此時,AAA是指其中一個塊的行之一;例如,在第一次通過時,考慮到上面的數據集,

AAA == [ 1 4 4 ..., 952 0 0] 

這是一個單獨的列表,沒有引用數據結構作爲一個整體。 AAA[0]可用於訪問第一列1中的數字,因爲這是列表操作的方式。該行的第二列將在AAA[1]中,依此類推。但是AAA[0][1]會拋出一個錯誤,因爲它等於(AAA[0])[1],在這種情況下它等於(1)[1],但數字不能被索引。 (什麼是數字1的第二個元素?)

for i in range(len(inputfile)): ### number of datablock = 5 
    for j in range(len(inputfile[i])):  ### number of lines per a datablock = 4081 
     for k in range(len(inputfile[i][j])):  ### number of columns per line = 9 
      AAA = inputfile[i][j][0] 
      print AAA[0] 

這個時候,你的for循環,雖然還是低效的,至少是正確的,如果你想在整個數據結構中每一個數字遍歷。在底部,你會發現inputfile[i][j][k]是整數kj中的數據結構塊i。但是,您完全拋出k,並打印該行的第一個元素,對該行中的每個項目打印一次。 (事實上​​,它重複的次數與列的次數一樣多,應該是一條線索。)再一次,一旦你達到整數,你就無法進一步索引;沒有inputfile[i][j][0][0]

授予,一旦你到達一個元素,你可以通過改變索引來查看附近的元素。例如,一個三維元胞自動機可能想看看它的每一個鄰居。對數據邊緣進行適當的校正並檢查以確保每個塊和行都是正確的長度(Python不會爲你做這件事),可能看起來像這樣:

for i, block in enumerate(inputfile): 
    for j, row in enumerate(block): 
     for k, num in enumerate(row): 
      neighbors = sum(
       inputfile[i][j][k-1], 
       inputfile[i][j][k+1], 
       inputfile[i][j-1][k], 
       inputfile[i][j+1][k], 
       inputfile[i-1][j][k], 
       inputfile[i+1][j][k], 
      ) 
      alive = 3 <= neigbors <= 4 
+0

非常感謝。所以,我需要在做一些事情之前定義一個空數組。它是否正確? 有沒有什麼方法可以對所有元素進行切片和索引,並在numpy或pandas中訪問3d數組? – exsonic01 2014-10-07 01:51:10

+0

你需要在使用它之前定義一個數組,是的。無論您將其定義爲空白並使用append填充它,或者使用列表理解一次定義整個事件,則取決於您。或者,您可以跳過數組以支持索引。我沒有使用numpy或pandas,但它們似乎具有相似的N維數組結構,並且可能有也可能沒有一個可以實現您想要的功能。 – eswald 2014-10-08 12:39:37