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

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

新規登録して質問してみよう
ただいま回答率
85.47%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4179閲覧

Python CSVファイルの座標データから直線を描画したい

rain22

総合スコア6

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/16 13:09

直線の描画についての質問です。

Pythonで二つのCSVファイルA、B(カンマ区切り)において、
ファイルAの中に格納されている座標からファイルBの中に格納されている
座標の中で最短距離となる座標をそれぞれ抽出しています。
そして、抽出して紐づけした二点の座標すべての線分を描画したいと考えています。


CSVファイルの中身

A

10,1019,546 21,725,403 32,1022,1166 43,993,1353 54,795,915 65,753,1346 76,813,1358 87,433,581 98,255,370 109,109,818 1110,456,1211 1211,227,1031 1312,115,1063

B

1,x,y 20,1077,167 31,852,210 42,769,257 53,662193 64,1078,938 75,959,975 86,902,900 97,874,1157 108,817,1065 119,678,1165 1210,477,312 1311,306,208 1412,105,313 1513,106,550 1614,315,733 1715,510,1035 1816,324,1105 1917,216,1443 2018,112,1384

最短距離を抽出するコード(前回の質問で教えていただいたもの)

Python

1import itertools 2import pandas as pd 3import numpy as np 4 5df_a = pd.read_csv("A.csv", index_col=0) 6df_b = pd.read_csv("B.csv", index_col=0) 7 8# 全ての組み合わせの距離を求める 9df = pd.DataFrame(itertools.product(df_a.index, df_b.index), columns=['A', 'B']) 10df['dist'] = df.apply(lambda d: np.linalg.norm(df_a.loc[d.A] - df_b.loc[d.B]), axis=1) 11# データを縦軸にA、横軸にBをとるように成形 12df = df.pivot(index='A', columns='B', values='dist') 13print(df) 14# 各行(A)ごとに、一番短い距離となる列(B)を算出 15ret = df.idxmin(axis=1) 16print(ret)

出力結果は以下の通りです。
B 0 1 ... 17 18
A ...
0 280.230184 335.305794 ... 1300.405086 1413.224738
1 524.878177 226.094360 ... 1028.568849 1110.059774
2 710.829076 717.342344 ... 1155.066363 1295.451633
3 847.521060 833.175910 ... 1100.167547 1246.493888
4 662.180460 505.506252 ... 899.546735 1021.575510
5 951.238075 815.835704 ... 761.932027 907.196074
6 921.454236 814.339041 ... 845.831319 991.841375
7 955.745150 647.976594 ... 682.592435 727.238039
8 1170.275562 851.656409 ... 761.479826 745.461468
9 1443.644909 1135.496721 ... 468.006019 400.466674
10 1147.117022 903.004142 ... 376.029693 501.268256
11 1348.025590 1057.880531 ... 291.986708 297.795078
12 1500.054410 1204.310814 ... 305.067950 227.104798

[13 rows x 19 columns]
A
0 0
1 2
2 5
3 7
4 8
5 9
6 7
7 14
8 11
9 13
10 15
11 16
12 18
dtype: int64


今回実行したコード

Python

1import cv2 2 3img = cv2.imread('test.jpg') 4 5cv2.line(img, (1019,546),(1077,167),(255,0,0),3,cv2.LINE_4) 6 7cv2.imwrite('test_result.jpg', img)

現時点で手打ちしている座標の部分にCSVファイルA、Bから最短距離として
紐づけした二つの座標データを持ってきてループさせればいいと思うのですが、
方法が思いつかず、調べてもわかりませんでした。

前回の延長のような質問となってしまい申し訳ありません。

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

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

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

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

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

meg_

2020/01/16 14:59

具体的に分からないところは何でしょうか? CSVから値を抽出できますか? ループ方法が分かりませんか?
rain22

2020/01/16 23:42

CSVからの値抽出、ループ方法、どちらもわかりません。 わかりづらくて申し訳ありません。
guest

回答1

0

ベストアンサー

前回の結果を使ってループ処理を行う場合は以下のようになります。

Python

1# 各行(A)ごとに、一番短い距離となる列(B)を算出 2ret = df.idxmin(axis=1) 3 4# ループ処理 5for idx,val in ret.iteritems(): 6 x0, y0 = df_a.loc[idx, 'x'], df_a.loc[idx, 'y'] 7 x1, y1 = df_b.loc[val, 'x'], df_b.loc[val, 'y'] 8 print(f"({x0},{y0}) - ({x1},{y1})")

投稿2020/01/17 01:59

magichan

総合スコア15898

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

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

rain22

2020/01/18 01:56

回答ありがとうございます。 確認が遅くなってしまい申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問