1

Pythonの行列のすべての列で論理OR(1と0)を実行するための最も効率的なアプローチは何でしょうか?

   0    0    0
   0    0    0
   1    0    1
   0    0    1
OR 0    0    1
   _    _    _
   1    0    1

いくつかのコンテキスト:私は、これまで取り組んできた小さなプロジェクトのテーブルを生成するために動的計画法を採用しています。私は2つのテーブルを持っています。1つは3次元で、もう1つは2次元です。3次元テーブルでは、1または0のみが含まれ、もう1つにはintが含まれています。

2次元テーブルは3次元テーブルと同じように生成されるため、それらをインターリーブする必要があります。列全体をORしたい理由は、列に1が含まれているかどうかを確認するためです。ある場合、同じ列に2次元テーブルに1が含まれます。

例:

3次元テーブル:

[1][i][j]
1000010000000000...
1000000001000000...
1000000000010000...
1000000000000001...

[2][i][j]
1000100000000000...
1000001000000000...
1000000001000000...

2次元テーブル:(3次元テーブルの各列をOR処理した後、左端のインデックスが2次元テーブルの行に対応します):

1000010001100001...
100010100000000...

これがすべて明確かどうかはわかりません...しかし、助けてくれた人に感謝します!:D

使用した方法については説明しません

4

3 に答える 3

2

このデータをどのように表現しますか?それがリストのリストである場合は、3D配列の最後の2つのインデックスを交換して、「列」に順次リストとしてアクセスし、を使用できるようにしますany。これは、バニラCPythonで取得できる速度とほぼ同じです。ループはCランタイムで完全に実行されます。

于 2012-08-28T17:56:08.530 に答える
2

使用numpy

>>> from numpy import array
>>> m = array([[0,0,0],[0,0,0],[1,0,1],[0,0,1],[0,0,1]])
>>> m
array([[0, 0, 0],
       [0, 0, 0],
       [1, 0, 1],
       [0, 0, 1],
       [0, 0, 1]])
>>> m.any(0)*1
array([1, 0, 1])
>>> len('.any(0)*1')
9

または、少し簡潔にするために:

>>> m.any(axis=0)
array([ True, False,  True], dtype=bool)
>>> m.any(axis=0)*1 # make them ints
array([1, 0, 1])

純粋なPythonを使用する必要がある場合は、@ rkhayrovが推奨することを実際に実行し、必要に応じて、リストを参照するのと同じくらい簡単に列を参照できるように、転置とインデックスシャッフルを続けます。しかし、書く能力とm[:, 0]m[2:5, :]が簡単に諦めるにはあまりにも便利です。

于 2012-08-28T18:25:38.707 に答える
1

このような何かがそれを行う必要があります。マップとフィルターと同様に、reduceは不利になりつつあります。

col = 2
value = 0
for row in range(height):
    value |= matrix[row][col]

Python 2.xの場合、範囲の代わりにxrangeを使用します。

于 2012-08-28T17:55:29.140 に答える