2016-08-12 10 views
0

私はPythonでネストされたリストを作成してビデオ内のポイントに関する情報を格納しようとしていますが、結果を保存するための配列を作成するのに多くの問題があります。リストの構造は簡単です。トップレベルはフレームへの参照、次のレベルはマーカーへの参照、最後のレベルはマーカーのポイントです。したがって、たとえば、リストのようなセットアップです:markerListを呼び出すPythonでネストされたリストを作成する

markerList # a long list of every marker in every frame markerList[0] # every marker in the first frame markerList[0][0] # the first marker of the first frame markerList[0][0][0] # the x value of the first marker of the first frame

[0]のようになります。

array([[ 922.04443359, 903.  ], 
    [ 987.83850098, 891.38830566], 
    [ 843.27374268, 891.70471191], 
    [ 936.38446045, 873.34661865], 
    [ 965.52880859, 840.44445801], 
    [ 822.19567871, 834.06298828], 
    [ 903.48956299, 830.62268066], 
    [ 938.70031738, 825.71557617], 
    [ 853.09545898, 824.47247314], 
    [ 817.84277344, 816.05029297], 
    [ 1057.91186523, 815.52935791], 
    [ 833.23632812, 787.48504639], 
    [ 924.24224854, 755.53997803], 
    [ 836.07800293, 720.02764893], 
    [ 937.83880615, 714.11199951], 
    [ 813.3493042 , 720.30566406], 
    [ 797.09521484, 705.72729492], 
    [ 964.31713867, 703.246521 ], 
    [ 934.9864502 , 697.27099609], 
    [ 815.1550293 , 688.91473389], 
    [ 954.94085693, 685.88171387], 
    [ 797.70239258, 672.35119629], 
    [ 877.05749512, 659.94250488], 
    [ 962.24786377, 659.26495361], 
    [ 843.66131592, 618.83868408], 
    [ 901.50476074, 585.42541504], 
    [ 863.41851807, 584.4977417 ]], dtype=float32) 

問題は、すべてのフレームは、マーカーの異なる数が含まれていることです。マーカーリストと同じ長さの空の配列を作成したいのです(つまり、同じ数のフレーム)。各要素はmarkerListの最大フレームと同じサイズです。いくつかの重要な注意点があります:まず、最終的な配列(finalStackと呼ぶ)がセルのセルである.matファイルに結果を保存します。次に、私はfinalStackの特定の部分を参照して割り当てることができる必要があります。ですから、ポイントをfinalStack [0] [22]に移動したいのであれば、私はそれを矛盾なく実行できる必要があります。これは、基本的には、どこにでもメソッドを追加することはできませんが、私の最初の問題も発見されました。新しいリストがすべて親リスト全体に重複することはありません。私はこれをいくつかの方法でやろうとしましたが、正しく動作するものはありません。ソリューションで

試み:別のSOの質問に続いて

、私は繰り返しfinalStackを作成しようとしましたが、無駄に。私は次の関数を作成しました:

def createFinalStack(numMarkers, numPoints, frames): 
    step = [[0]*numPoints for x in xrange(numMarkers)] 
    finalStack = [step]*frames 
    return finalStack 

しかし、これはfinalStack[0][12]を割り当てることfinalStack[2][12] == finalStack[20][12] == finalStack[0][12]につながることなど、すべての割り当ては、親リスト全体にコピーされます。この例では、numMarkers = 40、numPoints = 2(ちょうどx & y)、frames = 200です。最終的な配列は200 x 40 x 2です。

これは、私が望むことをやり遂げる方法は、私はコピーエラー(私はそれが参照の問題だと知っている、私はちょうどこの文脈でそれを避ける方法を知らない)を過ぎることはできません。

もう一つの単純な解決策は、copy.deepcopy(markerList)を使用してmarkerListをコピーし、40個未満のマーカーで任意のフレームを埋め込んでnumMarkers = 40にし、他のものをゼロにすることです。しかし、私はすべてのフレームを循環させ、正しいフォーマットでポイントを追加し、その後はすべてを空にする良い方法を考え出すことはできません。

これでは十分な情報ではない場合は、大きなコンテキストと、それ以外の方法ではうまくいきませんでした。私はこれで解決策がひどく簡単だと確信しています。あなたが私を正しく証明できることを願っています!

ありがとうございます!

+0

'[0] * numPoints 'のために親リストを渡ってコピーしています。それを '[0の_範囲(len(numPoints)]]'または 'np.zeros(numPoints) 'に置き換えてみてください – Anonymous

+0

これはマットとして保存する際に問題を生じます。 )を形成する(40)。この方法に特有のものです。私はこれまでに問題がなかった。参考までに、保存方法は次の通りです: 'matdict = dict(markerers =(markerList)、sorted =(finalStack))scipy.io.savemat( 'pathname.mat'、matdict)' – godfreap

答えて

1

これは何が起こっているかを示しています

In [1334]: step=[[0]*3 for x in range(3)] 
In [1335]: step 
Out[1335]: [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
In [1336]: stack=[step]*4 
In [1337]: stack 
Out[1337]: 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
In [1338]: stack[0] 
Out[1338]: [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
In [1339]: stack[0][2]=3 
In [1340]: stack 
Out[1340]: 
[[[0, 0, 0], [0, 0, 0], 3], 
[[0, 0, 0], [0, 0, 0], 3], 
[[0, 0, 0], [0, 0, 0], 3], 
[[0, 0, 0], [0, 0, 0], 3]] 
In [1341]: step 
Out[1341]: [[0, 0, 0], [0, 0, 0], 3] 

新しいリストを作成するalist*nを使用すると、新しいリストが同じ基礎となるオブジェクトに複数のポインタが含まれています。一般的な規則として、*nを使用してリストを複製することは、後で値を変更する予定がある場合は危険です。

代わりに私はこの問題を持っていない右の次元の配列にする場合:、

In [1343]: np.zeros((4,3,3),int).tolist() 
Out[1343]: 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 

私はこのリストに値を割り当てた場合:

In [1342]: np.zeros((4,3,3),int) 
Out[1342]: 
array([[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     ... 
     [0, 0, 0]]]) 

またはリスト形式での私は一つだけのアイテムを変更します。

In [1344]: stack=np.zeros((4,3,3),int).tolist() 
In [1345]: stack[0][2]=3 
In [1346]: stack 
Out[1346]: 
[[[0, 0, 0], [0, 0, 0], 3], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 

私は本当にstack[0][2][1]=3を使用している必要がありますが、あなたは私を取得DEA。 Iは、アレイ状に同一の割り当てを行った場合、私はstack[0,2,:]=4ような式を使用しているべきである行全体

In [1347]: stack=np.zeros((4,3,3),int) 
In [1348]: stack[0][2]=3 
In [1349]: stack 
Out[1349]: 
array([[[0, 0, 0], 
     [0, 0, 0], 
     [3, 3, 3]], 

     [[0, 0, 0], 
     ... 
     [0, 0, 0]]]) 

を変更終わります。

すべての初期値が独立しているように、次のような3つのリストを作成することはおそらく可能です。しかし、この配列のアプローチは簡単です。

+0

これはうまくいきました。私は何かがうまくいかない場合、私は返信を投稿しますが、これは私が欲しいものをやっているようです。ありがとう!! – godfreap

関連する問題