2014-10-05 124 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