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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

配列

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

Q&A

1回答

760閲覧

Python Numpy 2次元配列で条件合致行のみ抽出

Linda1114

総合スコア4

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

配列

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

0グッド

0クリップ

投稿2020/02/28 07:25

前提・実現したいこと

Numpyで下記のように配列を組んだ際、
各行で数字が3連続以上ならんでる配列を除外するコーディングはどうすればよいでしょうか。

forで該当の行を削除するコードはできていますが、配列が大きくなった際に時間がかかるため、より効率的なコーディングがあればご教示いただきたく存じます。

配列 npArray = np.array( [[10, 11, 12, 15, 16], [13, 14, 16, 17, 22], [12, 14, 18, 21, 22], [10, 11, 12, 13, 15], [16, 17, 18, 25, 28]]) 結果  [[13, 14, 16, 17, 22], [12, 14, 18, 21, 22]]

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

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

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

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

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

meg_

2020/02/28 07:39

「forで該当の行を削除するコードはできていますが」こちらのコードを掲載してください。
guest

回答1

0

だいたいどれくらいのサイズの配列について、
必要な計算時間はどの程度でしょうか。
それによって、この回答で十分かどうかが変わってくるかと思います。

for文の逐次計算ではなく、Numpyの配列計算を利用するとよいかもしれません。
まず、「forで該当の行を削除するコード」と思われるコードを実装してみました。
(そのソースコードは質問者さんのものとほぼ同じものなのでここでは省略します)

次に、Numpyの配列計算を利用した場合、以下のように記述できます。
実は5行のシンプルなコードで実装できます。左隣との差を2回計算して、
1回目に1、2回目に0になるものがあればそこは3連続している行だと判定しています。

diffArray1 = np.diff(inputArray) diffArray2 = np.diff(diffArray1) checkArray = (diffArray1[:,:-1] == 1) & (diffArray2 == 0) okVector = np.sum(checkArray, axis = 1) == 0 okVector.tolist() outputArray = inputArray[okVector]

テストデータとして、質問でnpArrayとして定義されているものをnpArray = np.tile(npArray, (2000,3000))に大幅に拡大したものを使いました。

その結果、for文を使った逐次は約22.0秒かかりました。Numpyの配列計算は約1.3秒でした。

このテストでは約17倍の速度になりました。

テストケースはこれだけですが、ぜひ質問者さんのお持ちのデータで試してみてください。

以下は考察なのですが、雑談程度に流してください。
======================
考察です。
・テストケースに関してランダム性がありません(繰り返しの配列)が、このケースではfor文の逐次計算で3連続以上したら次の行に移るようにしたので、むしろfor文に計算しやすいテストケースになります。
・もちろん、配列計算ですので、途中の配列がメモリ確保できないほどの大規模な配列を扱う場合は計算できませんので、メモリ効率はfor文のほうが良いです(一般的にそういうものですが)。まあその場合は入力配列を分割して配列計算するのが良いと思います。

投稿2020/02/28 09:08

Matsui_hero

総合スコア346

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問