4

私はPythonが初めてです。だから私は、ジェネレーターのような凝ったものを使わずに、ループでこれをやりたいと思っています。2 つの 2D 配列があり、1 つは整数配列、もう 1 つは次のような文字列配列です。

  1. 整数 2D リスト:

    ここで、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]
    ]
    
  2. 文字列 2D リスト:

    partition2d = [
        ['A', '1', '2', '4'],
        ['B', '3', '5'],
        ['C', '6']
    ]
    

    partition[*][0]つまり、最初の列はラベルです。グループ A の場合、1、2、および 4 は、dataset2d から取得して数式を適用する必要がある行番号です。つまり、1 を読み取り、行 1 に移動しdataset2dて最初の列の値 iedataset2d[1][0]を読み取り、次に から 2partition2dを読み取り、データセット 2d の行 2 に移動して最初の列 ieを読み取ることを意味しますdataset2d[2][0]。同様に次のものを読みますdataset2d[4][0]

    次に、いくつかの計算を行い、値を取得して 2D リストに格納し、それらの行の dataset2d の次の列に移動します。したがって、この例では、次に読み取られる列の値はdataset2d[1][1], dataset2d[2][1], になりdataset2d[4][1]ます。もう一度計算を行い、その列の値を 1 つ取得して保存します。の最後の列に到達するまでこれを行いますdataset2d

    の次の行はpartition2dです[B, 3, 5]。だから私はdataset2d[3][0]、から始めますdataset2d[5][0]。その列の値を数式で取得します。それから realなどdataset2d [3][1]dataset2d[5][1]最後の列に到達するまで続きます。partition2d のすべての行が読み取られるまで、これを行います。

私が試したこと:

 for partitionRow in partition2d:
        for partitionCol in partitionRow:
                for colDataset in dataset2d:
                     print dataset2d[partitionCol][colDataset] 

私が直面している問題:

  1. partition2d は、A、B、C などの文字を含む最初の列をスキップする必要がある文字列配列です。
  2. partition2d で指定された行番号に対してのみ、dataset2d 列ごとに反復処理したいと考えています。したがって、colDataset は、その列の処理が完了した後にのみインクリメントする必要があります。

アップデート1:

テキストファイルからコンテンツを読み取っています.2Dリストのデータは、ファイルのコンテンツとサイズによって異なりますが、file1、つまりdataset2dとfile2、つまりpartition2dの構造は同じです。

Update2: エリックが出力がどのように見えるかについて尋ねたので。

 0.842322 0.94322 0.34232 0.900009    (For A)
 0.642322 0.44322 0.24232 0.800009    (For B)

これは単なる例であり、数字は私がランダムに入力したものです。したがって、最初の数値 0.842322 は、行 1、2、4 を考慮したグループ A の dataset2d[parttionCol][0] という式を dataset2d の列 0 に適用した結果です。

2 番目の数値 0.94322 は、データセット 2d の列 1 に式を適用した結果です。つまり、行 1、2、4 を考慮したグループ A のデータセット 2d[partitionCol][1] です。

3 番目の数値 0.34232 は、行 1、2、4 を考慮したグループ A のデータセット 2d[partitionCol][2] の列 2 に数式を適用した結果です。同様に、0.900009 が得られます。

2 行目の最初の数値、つまり 0.642322 は、行 3、5 を考慮したグループ B のデータセット 2d[parttionCol][0] の列 0 に式を適用した結果です。等々。

4

5 に答える 5

3

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

2番目のコードの説明(Numpyなし) :

[dataset2D[row_idx] for row_idx in row_indices]

これは基本的に、各行 ( dataset2D[row_idx]) を取り、それらをリストとしてまとめます。したがって、この式の結果はリストのリストです (指定された行インデックスから取得されます)。

for column in zip(*rows):

次に、列ごとzip(*rows)に繰り返します(必要なもの)。これは、各行の最初の要素を取得し、それらを組み合わせてtupleを形成することによって機能します。各反復で、結果は variable に格納されます。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

これが役立つことを願っています。

于 2013-09-19T08:49:34.543 に答える
2

イテレータを使用した拡張可能なソリューションを次に示します。

def partitions(data, p):
    for partition in p:
        label = partition[0]
        row_indices = partition[1:]
        rows = [dataset2D[row_idx] for row_idx in row_indices]
        columns = zip(*rows)

        yield label, columns

for label, columns in partitions(dataset2D, partitions2d):
    print "Processing", label
    for column in columns:
        print column
于 2013-09-19T09:55:31.740 に答える
1

設定:

d = [[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]]
s = [['A',1,2,4],['B',3,5],['C',6]]

結果はリスト l に入れられます

l = []
for r in s: #go over each [character,index0,index1,...]
    new_r = [r[0]] #create a new list to values given by indexN. Add in the character by default
    for i,c in enumerate(r[1:]): #go over each indexN. Using enumerate to keep track of what N is. 
        new_r.append(d[c][i]) #i is now the N in indexN. c is the column.
    l.append(new_r) #add that new list to l

その結果

>>> l
[['A', 0, 0, 1], ['B', 2, 0], ['C', 1]]

最初の反復の実行は次のようになります。

for r in s:
    #-> r = ['A',1,2,4]

    new_r = [r[0]] #= ['A']

    for i,c in enumerate([r[1:] = [1,2,4])
            #-> i = 0, c = 1
                new_r.append(d[1][i])
            #-> i = 1, c = 2
                #...
于 2013-09-19T08:47:30.363 に答える
1

partition2d は、A、B、C などの文字を含む最初の列をスキップする必要がある文字列配列です。

これはスライスと呼ばれます。

 for partitionCol in partitionRow[1:]:

上記のスニペットは最初の列をスキップします。

 for colDataset in dataset2d:

すでにあなたが望むことをしています。ここには C++ ループのような構造はありません。非常に非pythonicな方法で何かを行うことができますが:

 i=0
 for i in range(len(dataset2d)):
    print dataset2d[partitionCol][i]  
    i=+1

これは非常に悪いやり方です。配列と行列については、車輪を再発明しないことをお勧めします (これも Pythonic のものです)Numpy。特に: numpy.loadtxt

于 2013-09-19T08:44:23.853 に答える