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

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

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

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

Python

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

Q&A

解決済

1回答

1377閲覧

<python3>マウスで選択した範囲で一番大きい傾きを求めたい

A_7

総合スコア4

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/01/03 15:28

前提・実現したいこと

右クリックで範囲を選択し、その範囲の中で一番大きい傾きを正と負の方向両方求めたいです。

試したこと

まず、空のリストを作成し、xの増加量とyの増加量をそれぞれ求め、yの増加量/xの増加量をし、それら全てを空のリストに入れ、そのリストの最大値を求めるという求め方を考えましたが、マウスで選択した範囲で求める場合、毎回要素数が変わるため、xの増加量とyの増加量の求め方がわからず悩んでいます。
アドバイスを頂けたら嬉しいです。よろしくお願いします。

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4def oncmask(event): 5 6 global stat 7 global leftind, rightind 8 9 ind=np.searchsorted(xdata,event.xdata) 10 plt.title("You clicked index="+str(ind)) 11 if event.button==3 and stat==1: 12 leftind=ind 13 ax.plot([xdata[ind]],[ydata[ind]],".",color="red") 14 stat=2 15 elif event.button==3 and stat==2: 16 rightind=ind 17 ax.plot(xdata[leftind:rightind],ydata[leftind:rightind],color="red") 18 stat=3 19 print (leftind, rightind) 20 elif event.button==1 and event.dblclick==1 and stat==3: 21 plt.title("Approved") 22 mask[leftind:rightind]=False 23 stat=1 24 elif event.button==2 and stat==3: 25 plt.title("Canceled") 26 ax.plot(xdata[leftind:rightind],ydata[leftind:rightind],color="blue") 27 ax.plot([xdata[leftind]],[ydata[leftind]],".",color="green") 28 stat=1 29 fig.canvas.draw() 30 31def f(x): 32 temp =[] 33 for index in x: 34 temp.append(max(5.*index+10.,-3.*index + 10)) 35 return temp 36 37xdata = np.linspace(-10, 10, num=201) 38ydata = f(xdata)+ 5.*np.random.randn(xdata.size) 39mask=np.ones(len(xdata),dtype=bool) 40 41stat = 1 42fig=plt.figure() 43ax=fig.add_subplot(111) 44ax.plot(xdata,ydata) 45cid = fig.canvas.mpl_connect('button_press_event', oncmask) 46 47plt.show()

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じで区間内の傾きの最大最小を求める関数を定義できます。

Python

1def man_mix_diff(xs, ys): 2 dxs = zip(xs, xs[1:]) 3 dys = zip(ys, ys[1:]) 4 def diff(vals): 5 xs, ys = vals 6 dx = xs[1] - xs[0] 7 dy = ys[1] - ys[0] 8 return dy / dx 9 diffs = list(map(diff, zip(dxs, dys))) 10 return (max(diffs), min(diffs))

ポイントは zip(xs, xs[1:]) で、これで一つずれたデータをタプルのリストとして取得できます。

Python

1>>> xs = [0, 1, 2, 3] 2>>> zip(xs, xs[1:]) 3[(0,1),(1,2),(2,3)]

xs[1:] が一つ短いのでその分できるリストも短く終わります。これを y 成分にも作ってあげます。そして x と y のタプル一つに対して傾きを計算してあげる関数 diff を作りそれを map にかけてあげます(list() にしておきましょう。でないと max() は成功するのですが min() は失敗します。詳しく知りたかったら「Python リスト ジェネレーター」で調べよう)。最後に最大と最小を返して終わりです。使うときは

Python

1max_diff, min_diff = man_mix_diff(xdata[leftind:rightind], ydata[leftind:rightind])

でよいかと。

投稿2021/01/03 16:45

A_kirisaki

総合スコア2853

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

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

A_7

2021/01/04 15:04

回答をして頂き、ありがとうございます。無事に最大と最小の傾きを求める事ができました。zip関数で一つデータがずれたタプルを取得できるなど、初めて知る事もあり、とても勉強になりました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問