我是python新手。所以我想用循环来完成这项工作,而不用像发电机这样的花哨玩意儿。我有两个二维数组,一个整数数组,另一个字符串数组如下:
整数二维列表:
这里,dataset2d[0][0]是表中的行数,dataset[0][1]是列数。所以下面的2d列表有6行4列

dataset2d = [
    [6, 4],
    [0, 0, 0, 1],
    [1, 0, 2, 0],
    [2, 2, 0, 1],
    [1, 1, 1, 0],
    [0, 0, 1, 1],
    [1, 0, 2, 1]
]

字符串2d列表:
partition2d = [
    ['A', '1', '2', '4'],
    ['B', '3', '5'],
    ['C', '6']
]

第一列是一个标签。对于组A,1、2和4是我需要从dataset2d中提取并应用公式的行号。因此,这意味着我将读取1,转到partition[*][0]中的第1行并读取第一列值,即dataset2d,然后从dataset2d[1][0]中读取2,转到数据集2d的第2行并读取第一列,即partition2d。类似地,下一篇我将阅读dataset2d[2][0]。
然后我将进行一些计算,获取一个值并将其存储在2d列表中,然后转到dataset2d中这些行的下一列。因此在本例中,下一个读取的列值将是dataset2d[4][0],dataset2d[1][1],dataset2d[2][1]。然后再次进行一些计算,得到该列的一个值,并存储它。在到达dataset2d[4][1]的最后一列之前,我会一直这样做。
dataset2d中的下一行是partition2d。所以我从[B, 3, 5],dataset2d[3][0]开始。获取该列的值为公式。然后是realdataset2d[5][0],dataset2d [3][1]等,直到我到达最后一列。我这样做,直到读取partition2d中的所有行。
我试过的:
 for partitionRow in partition2d:
        for partitionCol in partitionRow:
                for colDataset in dataset2d:
                     print dataset2d[partitionCol][colDataset]

我面临的问题是:
partition2d是一个字符串数组,我需要跳过第一列,该列包含a、b、c等字符。
我只想在dataset2d列中对partition2d中给定的行号进行迭代,所以coldataset应该在我处理完该列之后才增加。
更新1:
我正在从文本文件中读取内容,并且2D列表中的数据可以根据文件内容和大小而变化,但是FILIE1、DeaseT2D和FILIE2 IE分区2D的结构将是相同的。
update2:因为eric询问了输出应该是什么样的。
 0.842322 0.94322 0.34232 0.900009    (For A)
 0.642322 0.44322 0.24232 0.800009    (For B)

这只是一个例子,数字是我随机输入的。
因此,第一个数字0.842322是将公式应用于dataset2d的第0列的结果,即dataset2d[partitioncol][0]对于考虑了第1、2、4行的a组。
第二个数字0.94322是将公式应用于dataset2d的列1的结果,即dataset2d[partitioncol][1]对于考虑了行1,24的组a。
第三个数,0.34232是将公式应用于数据集2D的列2的结果,即A组的数据集2D [分区Cope]〔2〕,考虑了行1,2 4。同样,我们得到0.900009。
第二行中的第一个数字,即0.642322是将公式应用于dataset2d的第0列的结果,即dataset2d[partitioncol][0],对于考虑了第3、5行的b组。等等。

最佳答案

您可以使用Numpy(我希望这对您来说不太新奇):

import numpy
dataset2D = [ [6, 4], [0, 0, 0, 1], [1, 0, 2, 0], [2, 2, 0, 1], [1, 1, 1, 0], [0, 0, 1, 1], [1, 0, 2, 1] ]
dataset2D_size = dataset2D[0]
dataset2D = numpy.array(dataset2D)
partition2D = [ ['A', '1', '2', '4'], ['B', '3', '5'], ['C', '6'] ]

for partition in partition2D:
    label = partition[0]

    row_indices = [int(i) for i in partition[1:]]

    # Take the specified rows
    rows = dataset2D[row_indices]

    # Iterate the columns (this is the power of Python!)
    for column in zip(*rows):
        # Now, column will contain one column of data from specified row indices
        print column, # Apply your formula here
    print

或者如果您不想安装numpy,可以这样做(实际上,这是您想要的):
dataset2D = [ [6, 4], [0, 0, 0, 1], [1, 0, 2, 0], [2, 2, 0, 1], [1, 1, 1, 0], [0, 0, 1, 1], [1, 0, 2, 1] ]
partition2D = [ ['A', '1', '2', '4'], ['B', '3', '5'], ['C', '6'] ]

dataset2D_size = dataset2D[0]

for partition in partition2D:
    label = partition[0]

    row_indices = [int(i) for i in partition[1:]]

    rows = [dataset2D[row_idx] for row_idx in row_indices]

    for column in zip(*rows):
        print column,
    print

两者都将打印:
(0, 1, 1) (0, 0, 1) (0, 2, 1) (1, 0, 0)
(2, 0) (2, 0) (0, 1) (1, 1)
(1,) (0,) (2,) (1,)

Explanation of second code (without Numpy):

[dataset2D[row_idx] for row_idx in row_indices]

基本上就是把每一行(dataset2D[row_idx])整理成一个列表。所以这个表达式的结果是一个列表列表(来自指定的行索引)
for column in zip(*rows):

然后zip(*rows)将按列迭代(您需要的)。这是通过获取每行的第一个元素,然后将它们组合在一起形成tuple。在每次迭代中,结果都存储在变量column中。
然后在for column in zip(*rows):中,您已经从指定行中获得了预期的按列迭代元素!
应用公式,只需将print column,改为你想做的事情。例如,我修改代码以包含行号和列号:
print 'Processing partition %s' % label
for (col_num, column) in enumerate(zip(*rows)):
    print 'Column number: %d' % col_num
    for (row_num, element) in enumerate(column):
        print '[%d,%d]: %d' % (row_indices[row_num], col_num, element)

这将导致:
处理分区A
列号:0
[1,0]:0
[2,0]:1
[4,0]:1个
列号:1
[1,1]:0
[2,1]:0
[4,1]:1个
列号:2
[1,2]:0
[2,2]:2个
[4,2]:1个
列号:3
[1,3]:1个
[2,3]:0
[4,3]:0
处理分区B
列号:0
[3,0]:2个
[5,0]:0
列号:1
[3,1]:2个
[5,1]:0
列号:2
[3,2]:0
[5,2]:1个
列号:3
[3,3]:1个
[5,3]:1个
处理分区C
列号:0
[6,0]:1个
列号:1
[6,1]:0
列号:2
[6,3]:2个
列号:3
[6,3]:1个
我希望这能有帮助。

10-06 13:53