2017-04-22 6 views
2

別の整数リスト(またはNumpy配列)に1の要素のインデックスを含むPythonリストを作成しようとしています。これはまた、別の配列にある値の位置を含むインデックス配列を作成する

#--- 1D case --- 
idx = [ i for i in range(len(A)) if A[ i ] == 1 ] 

#--- 2D case --- 
idx2 = [] 
for i in range(len(B)): 
    tmp = [ k for k in range(len(B[ i ])) if B[ i ][ k ] == 1 ] 
    idx2.append(tmp) 

ように、よりコンパクトに記述することができる

#--- 1D case --- 
A = [ 1, 0, 0, 1, 1 ] 
idx = [] 
for i in range(len(A)): 
    if A[ i ] == 1 : idx.append(i) 

print(idx) # [ 0, 3, 4 ] 

#--- 2D case --- 
B = [ [ 1, 0, 0, 1, 1 ], [ 0, 1, 1 ] ] 
idx2 = [ [] for i in range(len(B)) ] 

for i in range(len(B)): 
    for j in range(len(B[ i ])): 
     if B[ i ][ j ] == 1 : idx2[ i ].append(j) 

print(idx2) #[ [0,3,4], [1,2] ] 

しかしがある場合、私は疑問に思って:私は何をしようとしていることは、(1-または2次元の場合のいずれかのために)このようなものです同じ目的のために使用できるさらにコンパクトな方法(または組み込み関数)です。純粋なPython、Numpy、または他の場所に便利な機能がありますか?

+0

私responceでの更新を見て一つをチェックサブリストの長さが等しくない場合のより多くの解決策 – Luchko

+0

@Luchko更新のおかげで、後ほど詳しく検討します。私が作成しているインデックス配列は、いくつかのクラスター分析のためのものです。そのサイズは先験的ではありませんので、私はPythonリストを使用しました。しかし、Numpy配列を索引付けに使用することもできます(リストを変換する - >配列)ので問題ありません。ありがとう:) – septc

答えて

3

あなたがあなたのlistを変換することができないようnumpy.where機能サブリストは、異なる長さnumpy.arrayを持っている場所が提供されている例で

チェックこの記事

Find indices of elements equal to zero from numpy array

import numpy as np 

#-----1D case------ 
A = np.array([0,1,2,3,1,4,5,1,2]) 
print(np.where(A==1)) 

>>> (array([1, 4, 7]),) 

#-----2D case------ 
A = np.array([[0,1,2,3],[1,2,3,5],[1,2,3,1]]) 
print(np.where(A==1)) 

>>> (array([0, 1, 2, 2]), array([1, 0, 0, 3])) 

はオプションではありません使用することができますarray(サブリストの長さは等しい必要があります)。ここでもう一つの解決策は次のとおりです。

B = [ [ 1, 0, 0, 1, 1 ], [ 0, 1, 1 ] ] 
inds = [(i,j) for j,ls in enumerate(B) for i,e in enumerate(ls) if e==1] 
print(inds) 

>>>> [(0, 0), (3, 0), (4, 0), (1, 1), (2, 1)] 
lsがサブリストに対応し

eサブリストの要素に

+0

ありがとう、それは働く:)(私は当初2Dのケースで問題があったが、私はnumpy配列に入力B配列を変換する必要があった...) – septc

1

が使用numpy.where

arr = np.arange(16).reshape(4,4) 

>>array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

np.where(arr == 1) 

>>(array([0]), array([1])) 

arr[0][1] 

>>1 
+0

ありがとう!取得されたインデックス配列から "for(i、j)in zip(id [0]、id [1]):..."のようなインデックスを抽出する一般的な方法はありますか? (id = np.where(arr == 1)) – septc

+0

あなたは '' zip(* id) '' – Luchko

+0

と書くこともできます。これはコードを非常に簡単にします。再度、感謝します :) – septc

関連する問題