多维数组索引和列访问

时间:2014-10-05 23:53:09

标签: python arrays

我有一个像

这样的三维数组
[[[   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个数据块。每个数据块有4081行和9列。

我的问题是关于以数据块方式访问列 我希望索引数据块,行和列,以及访问列,并使用if循环进行一些工作。我知道如何访问2D数组中的列,如:

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

但是如何访问每个数据块的列?

我试过(输入文件=上面的3d数组)

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

但它说'#AAA; AAA'没有定义。如何访问每个数据块的列?我需要制作[无]数组吗?没有使用空数组有没有其他方法?

另外,如何访问所访问列的特定元素?像AAA [i] [j] =第i个数据块和第1列的第j行。我可以再使用一个for循环来进行逐行访问吗?

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. 

但是这样,我无法访问第1列的每个元素,AAA [0]。如何访问此处的每个元素?

我认为可能有两个索引是不够的,所以我使用了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]

但是,我无法访问第1列的每个元素,它说' 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次,这不是我想要的。

我希望在分析过程中使用索引,在分析过程中将使用index作为元素。我希望在这个3d数组中访问列,并访问包含所有索引的每个元素。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

利用 zip

的良好做法

例如:

>>> 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 :(得分: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]在数据结构的块k的行j中是整数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