2016-05-16 17 views
0

私は2次元行列matrixKを持っています。例えば、それは私が行列の特定の列を削除する必要があり、これらの列が列としての指標に依存したパターンに応じて選択する必要がインデックスから行列を削除する

matrixK = [[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]] 

のようなものである可能性があります。つまり 、

for i in range(number_of_columns) 
    if (i satisfy a certain condtion): 
     column[i] needs to be deleted. 

と私は条件を満たして列を奪われ、matrixK同じ初期を取得する必要があり、最終的な結果として。それを行うための最善の方法は何ですか?

は一例として、上記で定義 matrixKを参照して、例を作成するには、の列2および4

+0

を望むものに依存filterlambda関数の内部状態を変更することができます。 SOはコード作成サービスではないことに注意してください。 –

+0

条件 'i%2 == 0'は、カラム0と2と4を削除します。これは、Python(および他の多くのコンピュータ言語)のndexingが0で始まるためです。 – martineau

答えて

0

これは、元のマトリックス内でその場所の列を削除する必要があるか、新しい列で置き換えるかによって、2つの異なる方法で行うことができます。各方法の例を以下に示します。
どちらも、行列のすべての行が同じ長さである必要はないことに注意してください。

# in-place removal of column in matrix 

matrixK = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] 

for row in matrixK: 
    for i in reversed(range(len(row))): 
     if i % 2 == 0: 
      del row[i:i+1] 

print('matrixK after: {}'.format(matrixK)) 

または:

# removal of columns in matrix by recreating it 

matrixK = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] 

matrixK = [[row[i] for i in range(len(row)) if i % 2] for row in matrixK] 

print('matrixK after: {}'.format(matrixK)) 

両出力:完全な開示の利益のために

matrixK after: [[1, 3], [6, 8], [11, 13]] 

詳細情報

、実行するための別の方法もありますので予めご了承くださいビルドを使用する列の削除非常に速いt-zip()機能で。

コードは他の2つほど読みにくく、行列のすべての行が同じ長さの場合にのみ機能しますが、上記の2つよりも高速です。

matrixK after: [(1, 3), (6, 8), (11, 13)] 

すべての行がtupleいうよりlistある場合は:生産

matrixK = zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2]) 

。それが問題だ場合、彼らは使用してサブリストに変換することができます:

matrixK = map(list, zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2])) 

これは、それを遅くんが、最初の2つの方法よりも、それはまだ多少速いです。

2

サブリストの長さが同じ場合はすることができますを削除する必要があり

for i in range(5): 
     if (i%2==0): 
      column[i] needs to be deleted 

を考えてみましょう次のようなリスト内包内zip()機能を使用します。

>>> zip(*[j for i, j in enumerate(zip(*matrixK)) if i%2 != 0]) 
[(1, 3), (6, 8), (11, 13)] 

それとも、ブールインデックスnumpyのARを使用することができますレイ:

>>> arr = np.array(matrixK) 
>>> arr[:,np.arange(arr.shape[1])%2 != 0] 
array([[ 1, 3], 
     [ 6, 8], 
     [11, 13]]) 
>>> 
1

columnFlagアレイを使用して、削除する必要がある列をマークできます。今

columnFlag = {} 
for column in range(number_of_columns): 
    if(satisfiesCondition(column)): 
     columnFlag.add(column) 

、あなたはmatrixKのそれよりも低いmatrixKlen(columnFlag)列と同じ行数を持つresult 2次元配列を作成することができます。

matrixKからresultには、columnFlagにない列のみをコピーし、result配列を返します。

1
>>> matrixK[:] = map(lambda y : list(filter(lambda x: y.index(x)%2 != 0, y)), matrixK) 
>>> matrixK 
[[1, 3], [6, 8], [11, 13]] 

あなたが実際にあなたが既に試したものを共有するために素敵だったでしょう

関連する問題