1

線の勾配から派生した整数の配列があります。配列は sign_slope と呼ばれ、次のようになります。

sign_slope = array([-1, 1, -1, ..., -1, -1, -1])

配列内の連続する項目が次のようなケースを探しています: 1, -1 たとえば、上記の sign_slope の出力から、次のことがわかります: sign_slope[1] = 1 and sign_slope[2] = -1 これが最初になりますアイテム/インデックス番号を検出したい多くの場合。(n-1) 番目のインデックス、つまり上記の場合は sign_slope[1] に対応するインデックス番号の配列またはリストを出力するコードが必要です。動作しているように見える以下の印刷ステートメントを書きました。ただし、現在のように値ではなくインデックス番号を出力し、それらをリストに追加するか、配列に入力する方法がわかりません。

for n in range(0, len(sign_slope)):
    if sign_slope[n] < 0 and sign_slope[n - 1] > 0:
        print sign_slope[n - 1]
    else:
        print 0

よろしくお願いします。

ケイン

4

2 に答える 2

4

インデックスの範囲をループすることは、一般的に非常に非Pythonicと見なされます。それは非常に読みにくく、あなたが本当にやろうとしていることを覆い隠します。そのため、サブリストを見つけるためのより良い解決策は、ビルトインを使用してループしenumerate()、値とともにインデックスを取得することです。より一般的なソリューションを提供し、それを使いやすいジェネレータにすることもできます。

def find_sublists(seq, sublist):
    length = len(sublist)
    for index, value in enumerate(seq):
        if value == sublist[0] and seq[index:index+length] == sublist:
            yield index

ここで行うことは、値がサブリストの先頭に一致するインデックスを取得して、リストをループすることです。次に、リストのそのセグメントがサブリストと一致するかどうかを確認し、一致する場合yieldはインデックスを確認します。これにより、リスト内の一致するすべてのサブリストをすばやく見つけることができます。

list次に、ビルトインを使用してジェネレーターからリストを作成することで、これを次のように使用できます。

>>> list(find_sublists([-1, 1, -1, -1, -1, 1, -1], [1, -1]))
[1, 5]
于 2012-10-18T10:25:14.543 に答える
0

sign_slope配列が配列であると仮定すると、ループを記述せずにこれを行うことができますnumpy

import numpy as np

# some data
sign_slope = np.array([-1, 1, -1, 1, 1, -1, -1])

# compute the differences in s
d = np.diff(sign_slope)

# compute the indices of elements in d that are nonzero
pos = np.where(d != 0)[0]

# elements pos[i] and pos[i]+1 are the indices
# of s that differ:
print s[pos[i]], s[pos[i]+1]

変数の値を示す ipython セッションを次に示します。

In [1]: import numpy as np

In [2]: s = np.array([-1, 1, -1, 1, 1, -1, -1])

In [3]: d = np.diff(s)

In [4]: print d
[ 2 -2  2  0 -2  0]

In [5]: pos = np.where(d != 0)[0]

In [6]: print pos
[0 1 2 4]

In [7]: print s[pos[0]], s[pos[0]+1]
-1 1

In [8]: print s[pos[1]], s[pos[1]+1]
1 -1

In [9]: print s[pos[2]], s[pos[2]+1]
-1 1

In [10]: print s[pos[3]], s[pos[3]+1]
1 -1

お役に立てれば

編集:実際、振り返ってみると、いくつかの違いがありません。折り返しご連絡いたします。混乱して申し訳ありません。

編集 2: 修正しました。ばかげたエラーを犯しました。

于 2012-10-18T10:41:23.100 に答える