2

私が(再び)立ち往生している問題で誰かが私を助けてくれることを願っています。

座標がある場合:

 x = array[0,1,2,3,4,3,2,3,-2,-4,-7,2,2]
 y = array[0,1,2,3,4,5,6,7,8,9,10,11,12]

Python で配列のリストを分類するの助けを借りて、私は作ることができました:

x = [(0, 1, 2, 3, 4), (4, 3, 2), (2, 3), (3, -2, -4, -7), (-7, 2), (2, 2)]

問題は、どのように y を次のようにすればよいかということです:

y = [(0,1,2,3,4),(4,5,6),(6,7),(7,8,9,10),(10,11),(11,12)]

x と y は実際には座標であり、互いに境界を接しているためです。

ループ関数を使用しようとしましたが、コードがまだ間違っていることに気付きました

se = []
for i in range(len(z)):
        k = z[i]
        for i in range(len(k)):
                se.append(y[i])

よろしくお願いします、

グレン

4

4 に答える 4

3

以前の質問からの @jamylak による回答を参照し、わずかな変更を示しています。

結果のパターンを に一致xさせることもできますyが、元のソリューションを変更して x と y をポイント (x,y) として扱うこともできます。

from itertools import groupby

x = [0,1,2,3,4,3,2,3,-2,-4,-7,2,2]
y = [0,1,2,3,4,5,6,7,8,9,10,11,12]

def slope(a,b): #Returns 1 for inc, 0 for equal and -1 for dec
    return (a > b) - (a < b) 

def groups(nums):
    # 
    # Change the call to slope() to assume 2d point tuples as values
    #
    for k,v in groupby(zip(nums,nums[1:]), lambda (x,y): slope(x[0],y[0])):
        yield next(v) + tuple(y for x,y in v) 

#
# Pass in a zipped data structure
#
print list(groups(zip(x,y)))
# result
[((0, 0), (1, 1), (2, 2), (3, 3), (4, 4)),
 ((4, 4), (3, 5), (2, 6)),
 ((2, 6), (3, 7)),
 ((3, 7), (-2, 8), (-4, 9), (-7, 10)),
 ((-7, 10), (2, 11)),
 ((2, 11), (2, 12))]

結果のフォーマットがあなたにとって望ましいかどうかはわかりませんが。

それらを分離する方法は次のとおりです。

from operator import itemgetter

result = list(groups(zip(x,y)))
x = [map(itemgetter(0), points) for points in result]
y = [map(itemgetter(1), points) for points in result]
print x
# [[0, 1, 2, 3, 4], [4, 3, 2], [2, 3], [3, -2, -4, -7], [-7, 2], [2, 2]]
print y
# [[0, 1, 2, 3, 4], [4, 5, 6], [6, 7], [7, 8, 9, 10], [10, 11], [11, 12]]

または@jamylakが提案したように:

x,y = zip(*[zip(*points) for points in result])

groups()また、メソッドの変更により N 次元のポイントまたはデータセットがどのように許可されるかについて、@jamylak が話していることを説明するために、次のように説明します。

z = ['foo',1,2,'bar',4,5,6,'foo',8,9,10,'bar',12]
print list(groups(zip(x,y,z)))
# result
[((0, 0, 'foo'), (1, 1, 1), (2, 2, 2), (3, 3, 'bar'), (4, 4, 4)),
 ((4, 4, 4), (3, 5, 5), (2, 6, 6)),
 ((2, 6, 6), (3, 7, 'foo')),
 ((3, 7, 'foo'), (-2, 8, 8), (-4, 9, 9), (-7, 10, 10)),
 ((-7, 10, 10), (2, 11, 'bar')),
 ((2, 11, 'bar'), (2, 12, 12))]

任意のデータセットであり、常にそれぞれの最初の要素でグループ化されていることがわかります。

于 2012-05-17T20:28:15.653 に答える
2

以下はあなたが望むことをします:

x = [(0, 1, 2, 3, 4), (4, 3, 2), (2, 3), (3, -2, -4, -7), (-7, 2), (2, 2)]
y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

s = map(len, x)
s = [0] + [sum(s[:i])-i for i in range(1, len(s))] + [len(y)]
y = [tuple(y[a:b+1]) for a, b in zip(s, s[1:])]

結果:

>>> y
[(0, 1, 2, 3, 4), (4, 5, 6), (6, 7), (7, 8, 9, 10), (10, 11), (11, 12)]

これは基本的に、y分割される位置のリストを作成します。の各タプルの長さを使用してこれを計算しxますが、セットの最後の要素が次のセットの次の要素として含まれているため、少し注意が必要です。

これがどのように機能するかを明確にするのに役立つ中間値の 1 つを次に示します。

>>> zip(s, s[1:])
[(0, 4), (4, 6), (6, 7), (7, 10), (10, 11), (11, 13)]

これを使用して、次のyように new を構築します。

[(0, 4), (4,  6), (6,  7), (7, 10), (10, 11), (11, 13)]
   \ |     \   \    \_  \
   | |      \  |      \  |
[y[0:4+1], y[4:6+1], y[6:7+1], ...]
于 2012-05-17T20:28:31.307 に答える
0

これは numpy を使用してどうですか。最初の問題を同時に解決します。

numpy を np としてインポート

x=(0, 1, 2, 3, 4, 3, 2, 3, -2, -4, -7, 2, 2)
y=範囲(13)

#一階微分、傾きを求める
dx = リスト ((np.diff(x)>0)*1)

#一次微分は最初の値を失いますが、常にそれを維持したい
#2番目の値より低いか高いかを判断するだけ

d0=((x[0]-x[1])>0)*1

#一階微分を二階微分(ピーク)に足す
ddx = [d0,]+list(np.abs(np.diff(dx)))

p=0
rx=[]
ry=[]

enumerate(ddx) の n、v の場合:
    v==1 の場合:
        rx.append(tuple(x[p:n+1]))
        ry.append(タプル(y[p:n+1]))
        p=n

プリント受信機
印刷する

于 2012-05-17T22:31:37.197 に答える
0

少し醜いですが、動作します:

se = []
y2 = [y[0]]
i = 1
for xrun in x:
    first = True
    for xv in xrun:
        if first:
            first = False
            continue
        y2.insert( len(y2), y[i] )
        i += 1
    se.insert( len(se), tuple(y2) )
    y2 = [y[i-1]]
于 2012-05-17T20:27:54.297 に答える