2017-07-10 16 views
0

を区切るためにポイントのリストのリストを変換:私はリストがそうのような構造しているyとxリスト

>>> print(pts) 
[[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 

そして私は、すべてのxとyの点がとても似別々に連結必要があります。

>>> print(y) 
[120 121 122 130 131 132] 
>>> print(x) 
[1200 1201 1202 1300 1301 1302 

元のリストは、以下の方法により作成されます。最終的な結果は、Y独立しなければならない

pts = [] 
y = [120, 121, 122] 
x = [1200, 1201, 1202] 
pts.append(list(zip(y, x))) 
x = [1300, 1301, 1302] 
y = [130, 131, 132] 
pts.append(list(zip(y, x))) 

およびリストをxは私は、Wそれを使用することができi番目のnp.polyfit()。個々のポイントリストとオーバーオールリストの長さは異なりますが、私は常に等しい長さのyポイントとxポイントを持ちます。私は、形を変えスライスする方法があるべきだと思っていますか?たぶん、私は平らにして、yのすべての偶数のインデックスとyの奇数のインデックスを取ることができますか?

+0

このケースには追加のレベルのネスティングがあるため、重複は直接適用できません。 – hpaulj

答えて

4

あなたはこれを試すことができます。

from itertools import chain 

pts = [[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 

all_points = list(chain(*pts)) 

y = [i[0] for i in all_points] 

x = [i[1] for i in all_points] 

print y 

print x 

出力:

[120, 121, 122, 130, 131, 132] 

[1200, 1201, 1202, 1300, 1301, 1302] 

itertools.chain()を使用すると、ネストされたリストを平らにし、タプルにアクセスすることができるようになります。

+0

あなたは勝者です、ありがとう!リストを平坦化するために、私はall_points = [サブリスト内の項目のサブリストの項目]を使用しました。実際の問題は、アレイのインデックスを新しいリストに引き出す方法を知らなかったことです。ありがとう! – DrTarr

+0

@NateGrecoこの回答を受け入れることをお勧めします。 –

+0

私は、5分の制限があります。 – DrTarr

3

また、リスト内包でzipを使用することができます。小さなリストを開始するときに

x, y = zip(*(p for s in pts for p in s)) 

x 
# (120, 121, 122, 130, 131, 132) 

y 
# (1200, 1201, 1202, 1300, 1301, 1302) 
+1

投稿前私は同じことがわかった。 +1。ところで、最後の 'map(list、...) 'を適用してポイントのリストを返すことがあります。 –

+0

@cᴏʟᴅscommentコメントをいただきありがとうございます。私は 'np.polyfit'も引数としてタプルを受け付けると思いますので、この場合はそれほど重要ではありません。しかし、OPが念頭に置いていることを達成するためには何か素晴らしいことになるでしょう。 – Psidom

+0

'polyfit'は2つの入力に' asarray'を適用します。 – hpaulj

1

は、通常、純粋なリストのアプローチが高速です。しかし、numpy関数にはasarrayが入力されているので、配列転置の方法をお勧めします。

arr = np.array(pts) # 2x3x2 array 
arr = arr.reshape(6,2) 
x, y = arr.T # unpack a 2x6 array 

テスト:

order = int(deg) + 1 
x = NX.asarray(x) + 0.0 
y = NX.asarray(y) + 0.0 

の場合:と

In [614]: pts 
Out[614]: 
[[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 
In [615]: np.array(pts).shape 
Out[615]: (2, 3, 2) 
In [616]: np.array(pts).reshape(-1,2).T 
Out[616]: 
array([[ 120, 121, 122, 130, 131, 132], 
     [1200, 1201, 1202, 1300, 1301, 1302]]) 
In [617]: y, x = np.array(pts).reshape(-1,2).T 
In [618]: y 
Out[618]: array([120, 121, 122, 130, 131, 132]) 
In [619]: x 
Out[619]: array([1200, 1201, 1202, 1300, 1301, 1302]) 

np.polyfit開始0がextendで作成された共通zip*は十分

In [625]: pts = [] 
    ...: y = [120, 121, 122] 
    ...: x = [1200, 1201, 1202] 
    ...: pts.extend(list(zip(y, x))) 
    ...: x = [1300, 1301, 1302] 
    ...: y = [130, 131, 132] 
    ...: pts.extend(list(zip(y, x))) 
    ...: 
In [626]: pts 
Out[626]: [(120, 1200), (121, 1201), (122, 1202), (130, 1300), (131, 1301), (132, 1302)] 
In [627]: y,x = list(zip(*pts)) 
In [628]: y 
Out[628]: (120, 121, 122, 130, 131, 132) 
In [629]: x 
Out[629]: (1200, 1201, 1202, 1300, 1301, 1302) 

chain平坦化は任意のリストの内包の必要性を排除し、*zip転置と組み合わせることができますされていたであろう。

In [642]: pts 
Out[642]: 
[[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 
In [643]: y,x=list(zip(*chain(*pts))) 
In [644]: y 
Out[644]: (120, 121, 122, 130, 131, 132) 
In [645]: x 
Out[645]: (1200, 1201, 1202, 1300, 1301, 1302) 
+0

extendは良い選択でしたが、後でインデックス(ポイントの集合)を削除する機能も維持しなければなりません。 – DrTarr

関連する問題