質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

243閲覧

重複チェックして値を追加するコード

Cielwoo

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/10/14 12:39

###前提・実現したいこと
Python3での質問です。簡単に説明すれば
list = [ [[1,1],[2,2],[33]], [[4 4],[5 5],[6 6]] ]
このような多重配列があったとして
このリストを重複チェックして、新しく[[7,7],[8,8]]を
入れる方法がわからなくて困っています。

###該当のソースコード
def new_id(cx,cy,ox,oy):
/ global n_id

/ for j in range(0,len(n_id)):
/ for k in range(len(n_id[j])):
/ if(n_id[j][k] == [ox,oy]):
/ n_id[j] = n_id[j] + [[cx,cy]]
/ elif(n_id[j][k] != [ox,oy]):
/ n_id = n_id + [[[cx,cy]]]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/10/14 12:43

『重複チェック』が何を指すか曖昧です。[7, 7]が重複しないか調べるのですか?あるいは、[[7, 7], [8, 8]]が重複しないか調べるのですか?理想とする入出力はなんでしょう?
Cielwoo

2017/10/14 13:20 編集

[7,7]が重複していなかったらリストに入れたいです!
LouiS0616

2017/10/14 13:24

『二重リストの要素を持つリストに要素を追加したいが、その際リストの第一要素が既存の要素の第一要素と重複がないか確認したい』ということですか?
LouiS0616

2017/10/14 13:24

ややこしいこと言ってるな、と思われるかもしれませんが、逆に言うとそれくらい厳密に言わないといくらでも多重解釈できる質問なのです。実行例を入れるともう少し意図が伝わりやすくなります。
Cielwoo

2017/10/14 13:30

説明不足ですみません。例えば、list = [ [[1,1],[2,2,],[3,3]], [[4 4],[5 5],[6 6]] ]に[1,1]があるかないか重複確認してあったやそのままでなかったら[[1,1]]としてリストに追加したいです。
LouiS0616

2017/10/14 14:41

なんのためにそのような操作が必要なのでしょうか?背景が見えると、より適格なアドバイスが出来るようになります。
Cielwoo

2017/10/14 14:49

監視カメラ上で認識した人たちの座標をリスト化が目的で、最終的にはそのリストから座標を線でつないで人たちの軌跡を出したいです。opencvを使っています。
LouiS0616

2017/10/14 14:56

毎回リストの数が増減しては、追跡に応用できないような気がします。逆になんらかのアルゴリズムで人物を同定できるなら簡単でしょうが。
LouiS0616

2017/10/14 14:57

OpenCVの機能で人物をトラッキングして、その軌跡を座標に変換する方が簡単なのではないでしょうか。
Cielwoo

2017/10/14 15:05

トラッキング機能があるのは知っていて、リスト化したら効率が良くないのも知っています。でも一度この方法でやって見たいんですけど、上手くいかず質問しました。もし時間に余裕がありましたらコードの修正お願いします。
LouiS0616

2017/10/14 15:14

うーん... もしこれで期待通りリストが得られたとして、どのようにそれを活用するのです?どの座標が同一人物のものであるかどうやって特定するのです?それに、どんなに上手に作っても、人がすれ違った瞬間正しい追跡が不可能になるのでは。
Cielwoo

2017/10/14 15:20

すれ違いの解決までは求めていないのでとりあえず軌跡でどの方向に歩いて行ったのか見れれば十分です!
guest

回答1

0

ベストアンサー

註:質問に対する直接的な回答ではありません。
__修正依頼のやり取りを元に下記の回答をしています。

監視カメラで人物を追跡する際、このような制約があるとします。

  1. 人物の検出ミスが起きえない
  2. 人物が撮影範囲外に移動しない
  3. 人物が監視カメラ上で重ならず、近づくこともない

ほとんどあり得ない状況ですが、そうするとこのように座標を管理できます。

疑似コード

Python

1# 上記制約によりret_listの長さは毎回同じで、対応する人物の順序も同じ 2def find_humans(frame): 3 ret_list = [] 4 ... 5 6 for human in found_humans: 7 ret_list.append(human.x, human.y) 8 9 ... 10 return ret_list 11 12def main(): 13 ... 14 15 coordinate_list = [] 16 while カメラが動いている: 17 ... 18 19 coordinate_list.append(find_humans(frame)) 20 ... 21 22 ... 23 24 # 人物01の軌跡 25 track_coord_01 = coordinate_listの0列目のスライス

こんな感じですかね。
ただ、兎にも角にも制約が多くて、全く想定通りには働かないでしょう。


例えばCNNを用いて人物再同定を可能にすると、上記制約がかなりましになります。

  1. 人物が監視カメラ上で重ならず、近づくこともない

疑似コード

Python

1def find_humans(...): 2 上記とほぼ同じ 3 4def check_human_id(座標): 5 ... 6 7 return human_id 8 9def main(): 10 ... 11 12 coordinate_dict = {} 13 while カメラが動いている: 14 ... 15 16 for human in find_human(frame): 17 id = check_human_id(座標) 18 if id in coordinate_dict: 19 coordinate_dict[id].append(座標) 20 else: 21 coordinate_dict[id] = [座標] 22 ... 23 24 ... 25 26 # 人物01の軌跡 27 track_coord_01 = coordinate_dict[01]

ですので、人物の識別同定が出来るのはほぼ必須だと思います。
このままの方法で試してみても勉強にはなるでしょうが、非常に学習効率が悪いかと。

やはりOpenCVの機能でトラッキングするのが無難だと思います。
結論としては、おそらく無駄だし、やりきるにしては考察不足/実力不足ですかね。


ついでに
コードを拝見する限り、そもそもPythonの基礎知識が足りていないようです。
そちらの勉強も並行して進めるようにしてください。

本筋から逸れるので解説はしませんが、次のような点で不適です。

  • listの名前をシャドウイングしている
  • タプルあるいはクラスで構造化出来そうなデータを生で扱っている
  • おそらく無駄なループの仕方をしている
  • グローバル変数が当たり前のように存在し、しかも型が不明
  • 変数の名前から役割が想像できない
  • そもそもPythonではif文の条件式をカッコでくるまなくてよい
  • 適切に関数化していない結果ネストが深くなっている
  • 質問のやり取りを見る限り、おそらくご自身でもいまいち挙動がわかっていない

コードを見ているとよくないC言語の香りがします。
C言語を適切に扱えないまま、その流儀をPythonに持ち込んでわけがわからなくなっているのでは。

投稿2017/10/14 15:54

編集2017/10/14 15:57
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問