2016-08-29 22 views
-2

私は行ごとの繰り返しの順序を把握しようとしていましたが、できませんでした。 OK。サイズのndarray私が望んだ何(2, 11, 10)Pythonの行と列ごとの繰り返しの順序

a = np.array([ 
    [ 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], 
     [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], 
     [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [1, 0, 0, 1, 0, 1, 1, 1, 0, 0], 
     [1, 1, 0, 1, 1, 0, 1, 1, 0, 0], 
     [0, 1, 1, 1, 0, 0, 1, 1, 0, 1], 
     [1, 1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 1, 0, 1, 0, 0, 1, 1], 
     [0, 1, 1, 1, 0, 0, 1, 1, 0, 1] 
    ], 
    [ 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 1, 0, 0, 0, 1, 1], 
     [0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
     [1, 1, 0, 1, 0, 1, 1, 1, 0, 0], 
     [1, 1, 0, 1, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 0, 1, 1, 0, 0], 
     [1, 0, 0, 0, 1, 1, 0, 0, 1, 1], 
     [1, 1, 1, 0, 0, 1, 1, 1, 0, 1], 
     [1, 0, 0, 1, 1, 0, 1, 0, 1, 0], 
     [1, 0, 0, 0, 0, 0, 1, 0, 0, 0], 
     [1, 1, 1, 0, 0, 1, 1, 1, 0, 1] 
    ] 
]) 

が列に基づいて行あたりのすべての1'sの順序を取得することです考えることができます。最初の1が行内に見つかるたびに、注文開始は0から開始されます。 1が見つかった場合は2番目の行に移動し、次は1ですが、前の行の列インデックスにすでに1が存在する場合は無視されます。例えば

は、これらのリストを検討しましょう:

0 1 2 3 4 5 6 7 8 9 -> column index 
0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -> no 1's no order here 
1 [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], -> order starts at 0 
2 [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], -> order starts at 1 

行インデックス0で何1が存在しないので、何も、行インデックス1で列インデックス[0,1,5,6,7]中のものがあり、これは0に等しくなります起こりません。出力は、行インデックスで

column order 
0   0 
1   0 
2   - 
3   - 
4   - 
5   0 
6   0 
7   0 
8   - 
9   - 

2列インデックス[1,5,8]1が順玉葉ある1であるべきです。そこに15はすでにそれには0の注文があるので無視されますが、未知の注文の場合は1でなければなりません。最終的な出力は、私は、インデックス値にnumpyののnp.whereメソッドを使用してみましたが

column order 
0   0 
1   0 
2   - 
3   - 
4   - 
5   0 
6   0 
7   0 
8   1 
9   - 

する必要があります。このようなもの

index = np.asarray(np.where(a == 1)).T 

私は次に何をすべきかわかりません。誰でも助けてくれますか?

+0

私はあなたがこれをやろうとしている理由を聞いてもらえますか?私は質問が全く不明だとは思わない。私はちょうどあなたがこれでやっていることを考えることができません –

+0

これはあなたがこれの全体的な目標を共有した場合、これらの配列は実際に何ですか? – Bemmu

+0

@ gr1zzlybe4rこれは、スパイクニューラルネットワークエンコーダ用です。このアルゴリズムの1つを使用してスパイク時間を取得します。 – Akshay

答えて

1

質問のコメントとこの回答の以前のバージョンに基づいて、望む結果は、各列の最初の1の行インデックスの「密なランキング」を見つけることです。 (「高密度ランキング」の意味については、scipy.stats.rankdataの文章を参照してください。)結果は.argmax()メソッドとscipy.stats.rankdataの組み合わせを使用して検索できます。

2次元配列の次数を計算する関数です。この質問は、列がすべてゼロのときに何が起こるべきかを定義するものではありません。 orderはその列に値-1を割り当てます。例えば

from scipy.stats import rankdata 

def order(x): 
    result = x.argmax(axis=0) 
    result[(x == 0).all(axis=0)] = -1 
    rank = rankdata(result, method='dense') - 1 - np.any(result < 0) 
    return rank 

、ここで配列yされています。私たちは、機能order()は、2次元配列を期待し

In [73]: a 
Out[73]: 
array([[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], 
     [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], 
     [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [1, 0, 0, 1, 0, 1, 1, 1, 0, 0], 
     [1, 1, 0, 1, 1, 0, 1, 1, 0, 0], 
     [0, 1, 1, 1, 0, 0, 1, 1, 0, 1], 
     [1, 1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 1, 0, 1, 0, 0, 1, 1], 
     [0, 1, 1, 1, 0, 0, 1, 1, 0, 1]], 

     [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 1, 0, 0, 0, 1, 1], 
     [0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
     [1, 1, 0, 1, 0, 1, 1, 1, 0, 0], 
     [1, 1, 0, 1, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 0, 1, 1, 0, 0], 
     [1, 0, 0, 0, 1, 1, 0, 0, 1, 1], 
     [1, 1, 1, 0, 0, 1, 1, 1, 0, 1], 
     [1, 0, 0, 1, 1, 0, 1, 0, 1, 0], 
     [1, 0, 0, 0, 0, 0, 1, 0, 0, 0], 
     [1, 1, 1, 0, 0, 1, 1, 1, 0, 1]]]) 

ので:ここ

In [71]: y 
Out[71]: 
array([[0, 1, 0, 0, 1, 1, 0, 0], 
     [0, 0, 0, 0, 0, 1, 0, 0], 
     [1, 1, 1, 0, 1, 1, 0, 0], 
     [1, 0, 1, 1, 1, 1, 0, 0], 
     [1, 0, 0, 0, 1, 1, 1, 0]]) 

In [72]: order(y) 
Out[72]: array([ 1, 0, 1, 2, 0, 0, 3, -1]) 

質問から配列aですループを使用して各サブアレイの注文をaに入力する必要があります。

In [74]: np.array([order(m) for m in a]) 
Out[74]: 
array([[0, 0, 3, 3, 2, 0, 0, 0, 1, 4], 
     [2, 0, 3, 1, 0, 2, 2, 1, 0, 0]]) 
+1

@akshayこれが正しいかどうか聞いても、私はまだ問題文を理解していないので、非常に興味があります.D – Bemmu

+0

この回答は実際には正しくありません。 'a [0]'の順序は '[0,0,3,3,2,0,0,0,1,4]'です。申し訳ありません@WarrenWeckesser。 – Akshay

+0

これは、私が5時間前のコメントで提案した順序です!私はチャンスを得たときに私の答えを更新します。 –

関連する問題