🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Python

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

Q&A

解決済

1回答

807閲覧

2次元データから範囲内の要素を高速で抽出

ramin

総合スコア34

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/11/27 09:51

編集2019/11/27 09:56

【Python 3.7】

2つの要素x,yが与えられたときにx,yが満たす条件を探索してそれを抽出する、ということをできるだけ高速で行いたいです。
具体的には例えばx=2.5, y=1500であれば以下の表から8を抽出、という感じです。

↓y/x→0.5~2.02.0~5.05.0~10.010.0~20.020.0~50.0
200~500109621
500~1000109732
1000~500098753
5000~3000076531

これはあくまで例えで実際に使用したい2次元データは100×600ほどです。
for文で回せばできるのですが、時間がかかります。プログラムの関係上、数ミリ秒も無駄にしたくないです。
2次元データの型は特に指定はないです。

こういう探索に特化した方法やライブラリ等あれば教えていただきたいです。

【追記】
2次元データの更新はプログラム中では行わないため、2次元データの作成にかかる時間は考慮しません。

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

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

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

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

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

TaniguchiTakaki

2019/11/27 10:44 編集

いまいちその2次元データの構造がわからないのでこの例だとPythonのコードでどういう表現になるか書いてもらえますか?
guest

回答1

0

ベストアンサー

x, yの表を見た感じだと範囲の隙間は無いようなので、x, yそれぞれについて二分探索して
テーブル参照するのが一番簡単じゃないですかね。
100x600だと表データを作るのは大変そうですが、探索速度はそれほど悪くないはずです。

python

1from bisect import bisect_right 2 3def solve(x, y, val_dic, ys, xs): 4 y_pos = bisect_right(ys, y) 5 x_pos = bisect_right(xs, x) 6 return val_dic.get((x_pos, y_pos), -1) 7 8 9# 表の内容に基づいて、あらかじめ用意しておくデータ 10table = [ 11 [10, 9, 6, 2, 1], 12 [10, 9, 7, 3, 2], 13 [9, 8, 7, 5, 3], 14 [7, 6, 5, 3, 1] 15] 16# tableを(x, y)をキーにした辞書でアクセスできるように変換 17val_dic = {(x, y): val for y, row in enumerate(table, start=1) for x, val in enumerate(row, start=1)} 18 19ys = [200, 500, 1000, 5000, 30000] 20xs = [0.5, 2.0, 5.0, 10.0, 20.0, 50.0] 21 22 23# 動作チェック 24data = [(1, 200, 10), (2.5, 1500, 8), (3.0, 29999, 6), (7, 200, 6), (20, 500, 2), (49, 25000, 1), 25 (5.0, 29800, 5), (19.999, 5000, 3), (0.5, 1000, 9), (4.9999, 4999.9, 8), (0.51, 200.1, 10), 26 (0.49, 1500, -1), (5, 30000, -1), (0, 0, -1), (10**100, 2**342, -1), (-1, -1, -1)] 27for x, y, exp in data: 28 res = solve(x, y, val_dic, ys, xs) 29 assert res == exp, f'x, y = {x}, {y} -> {res} != {exp}'

投稿2019/11/27 11:40

編集2019/11/27 12:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ramin

2019/11/27 15:41 編集

二分探索がリストに含まれていない要素の挿入点まで調べられるとは知りませんでした。 二次元データ内で一部カーブフィッティングが使用できる部分があったので、最終的には二分探索+カーブフィッティングで実装しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問