web-dev-qa-db-ja.com

Pythonで2D配列の値のインデックスを見つける方法は?

2D numpy配列で値のすべてのインデックスを見つける方法を理解する必要があります。

たとえば、次の2次元配列があります。

_([[1 1 0 0],
  [0 0 1 1],
  [0 0 0 0]])
_

すべての1と0のインデックスを見つける必要があります。

_1: [(0, 0), (0, 1), (1, 2), (1, 3)]
0: [(0, 2), (0, 3), (1, 0), (1, 1), (the entire all row)]
_

私はこれを試しましたが、すべてのインデックスを提供しません:

_t = [(index, row.index(1)) for index, row in enumerate(x) if 1 in row]
_

基本的に、各行のインデックスのうち1つだけを提供します[(0, 0), (1, 2)]

12
Pete

_np.where_ を使用して、特定の条件が配列内にあるxおよびyインデックスの配列のタプルを返すことができます。

aが配列の名前の場合:

_>>> np.where(a == 1)
(array([0, 0, 1, 1]), array([0, 1, 2, 3]))
_

(x、y)ペアのリストが必要な場合、2つの配列をZipできます:

_>>> Zip(*np.where(a == 1))
[(0, 0), (0, 1), (1, 2), (1, 3)]
_

または、@ jmeは、np.asarray(x).Tがペアを生成するためのより効率的な方法になり得ることを指摘しています。

23
Alex Riley

あなたが提供したリスト内包の問題は、それが1レベルの深さまでしか行かないことであり、ネストされたリスト内包が必要です:

a = [[1,0,1],[0,0,1], [1,1,0]]

>>> [(ix,iy) for ix, row in enumerate(a) for iy, i in enumerate(row) if i == 0]
[(0, 1), (1, 0), (1, 1), (2, 2)]

そうは言っても、numpy配列を使用している場合は、ajcrで提案されている組み込み関数を使用することをお勧めします。

9
Mike