Python 多维数组索引和列访问

Python 多维数组索引和列访问,python,arrays,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

我有一个三维数组,比如

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

列\u 1=[行[0]用于输入文件中的行]

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

我试过像(上面的inputfile=3d数组)

但它说“名称”AAA“并没有定义。如何访问每个数据块的列?我是否需要制作[None]数组?有没有其他方法不使用空数组

另外,如何访问所访问列的特定元素?比如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 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列的每个元素,它表示“
标量变量的索引无效”
”。而且,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数组中访问列,访问每个元素和所有索引。我该怎么做

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

除非您使用类似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不允许为未定义变量的索引赋值,因为它不知道该变量应该是列表、dict还是其他更奇特的变量。特别是对于列表,它也不允许您指定一个尚不存在的索引;相反,
append
extend
方法用于:

AAA = []
for i, block in enumerate(inputfile):
    for j, row in enumerate(block):
        AAA.append(row[0])
print AAA[2]
(然而,这并不像上面的列表那样有效。)

第二行中的范围有一个明显的问题,多次查找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
循环虽然仍然效率低下,但至少是正确的。在底部,您会发现
inputfile[i][j][k]
在数据结构的块
i
的行
j
中是整数
k
。但是,您将完全抛出
k
,并为行中的每个项目打印行的第一个元素。(事实上,它的重复次数与列的重复次数完全相同,这应该是一个线索。)而且,再一次,一旦你得到整数,你就不能再索引了;没有
输入文件[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
对于i,枚举中的块(inputfile):
对于j,枚举(块)中的行:
对于k,枚举中的num(行):
邻居=总和(
输入文件[i][j][k-1],
输入文件[i][j][k+1],
输入文件[i][j-1][k],
输入文件[i][j+1][k],
输入文件[i-1][j][k],
输入文件[i+1][j][k],
)

alive=3您还没有定义AAA(并且您还没有用数据填充它)。“inputfile”是上面显示的数组吗?你希望AAA[i]是什么?@tdelaney是的,inputfile就是我展示的那个数组。总共20405行,由5个数据块组成,每个4081行。我希望AAA[I][j]是第一列,对于每个数据blcok I=1到5,对于每个行j=1到4081。@tdelaney我编辑了我的分析代码。你能给我一点意见吗?非常感谢。因此,我需要在执行某些操作之前定义一个空数组。这是正确的吗?是否有任何方法可以切片和索引所有元素,并访问numpy或pandas中的3d阵列?您需要定义ar
AAA == [   1    4    4 ...,  952    0    0]
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 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