多维数组索引与列访问

2024-04-24 13:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三维数组

[[[   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循环做一些工作。我知道如何访问二维数组中的列,例如:

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行。我应该再使用一个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]的每个元素。如何访问这里的每个元素?你知道吗

我认为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]

尽管如此,我仍然无法访问第1列的每个元素,它表示“invalid index to scalar variable”。另外,AAA包含每个元素中的9个元素,就像

>>> 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数组中的列,以及每个元素的所有索引。我该怎么做?你知道吗


Tags: ofto数据in元素numberforlen
2条回答

除非您使用的是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不允许为未定义变量的索引赋值,因为它不知道该变量应该是list、dict还是其他更奇特的变量。特别是对于列表,它也不允许您分配给尚不存在的索引;相反,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]是数据结构块i中第j行的整数k。但是,您要完全抛出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

利用拉链的良好实践:

例如:

>>> 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

相关问题 更多 >