私は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] * numPoints 'のために親リストを渡ってコピーしています。それを '[0の_範囲(len(numPoints)]]'または 'np.zeros(numPoints) 'に置き換えてみてください – Anonymous
これはマットとして保存する際に問題を生じます。 )を形成する(40)。この方法に特有のものです。私はこれまでに問題がなかった。参考までに、保存方法は次の通りです: 'matdict = dict(markerers =(markerList)、sorted =(finalStack))scipy.io.savemat( 'pathname.mat'、matdict)' – godfreap