我有一个像
这样的三维数组[[[ 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数组中访问列,并访问包含所有索引的每个元素。我怎样才能做到这一点?
答案 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不允许您分配未定义变量的索引,因为它不知道该变量是应该是列表,字典还是更具异国情调的东西。特别是对于列表,它也不允许您分配到尚不存在的索引;相反,append
或extend
方法用于:
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