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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

Q&A

解決済

2回答

1049閲覧

numpy配列(タプルのリスト)で度重なるextendにより重い箇所を軽くしたい

egd

総合スコア12

NumPy

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

0グッド

1クリップ

投稿2020/04/02 12:04

編集2020/04/02 13:22

こちらのコードのresのような、タプルの配列をfor文の中で結合して出来るnumpyの配列があります。(実際のコードから変数名や内容などをシンプル化しています。)

これを良く見てみると、arr_2の長さの分だけforループが行われ、その中で配列のextendが行われるため、arr_2が長くなってくると処理速度が極端に重くなることがわかりました。

これを配列の作り方などを上手くやることで、高速に処理することはできないでしょうか?

※forループの中のarr_1[4]の4のようなインデックスは、18個固定で数列のような規則性はありません。

Python

1# -*- coding: utf-8 -*- 2import numpy as np 3 4arr_1 = np.array([[0, 0, 1], [0, 0.5, -1], [-1, 0, -1], [0, -0.5, -1], [1, 0, -1]]) 5arr_2 = np.array([[0, 1, 2], [0, 1, 2]]) 6 7all_arr = [] 8for p in arr_2: 9 all_arr = [ 10 (arr_1[0], p), (arr_1[1], p), (arr_1[2], p), 11 (arr_1[0], p), (arr_1[1], p), (arr_1[4], p), 12 (arr_1[0], p), (arr_1[2], p), (arr_1[3], p), 13 (arr_1[0], p), (arr_1[3], p), (arr_1[4], p), 14 (arr_1[1], p), (arr_1[2], p), (arr_1[4], p), 15 (arr_1[2], p), (arr_1[3], p), (arr_1[4], p)] 16 all_arr.extend(all_arr) 17 18 19vtype = [('type_a', np.float32, 3), ('type_b', np.float32, 3)] 20res = np.array(all_arr, dtype=vtype) 21 22print(res)

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

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

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

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

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

guest

回答2

0

自己解決

以下のようにnp.tileとnp.repeatを使用することで、かなり高速化することができました!

Python

1arr_1 = np.array([[0, 0, 1], [0, 0.5, -1], [-1, 0, -1], [0, -0.5, -1], [1, 0, -1]]) 2arr_2 = np.array([[0, 1, 2], [0, 1, 2]]) 3 4idxs = np.array([0,1,2,0,1,4,0,2,3,0,3,4,1,2,4,2,3,4]) 5arr_3 = arr_1[idxs] 6 7vtype = [('type_a', np.float32, 3), ('type_b', np.float32, 3)] 8 9arr1_repeat = np.tile(arr_3.T,2).T 10arr2_repeat = np.repeat(arr_2,arr_3.shape[0],0) 11 12res = np.empty(arr1_repeat.shape[0],dtype=vtype) 13res['type_a']=arr1_repeat 14res['type_b']=arr2_repeat

投稿2020/04/03 00:55

egd

総合スコア12

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

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

kirara0048

2020/04/03 01:26

arr1_repeat = arr_1[np.tile(idxs, 2)] arr2_repeat = np.repeat(arr_2, idxs.size, 0)
guest

0

こちら、「arr_1の特定の要素の並び方18パターンに対して、それぞれpをつけ足して、それをpの分だけ付け足す」をしています。

試しに、for i in range(0,100000):でこのループを囲って疑似的に200000回ループしてみましたが、0.8秒くらいで終わりました。

もし、この時間よりももっとかかるのであれば、それは配列all_arrが大きくなりすぎてextendに時間がかかっているだけだと思いました。
all_arrを一括で持つ必要がない、つまり逐次的な処理ができたり、一つの変数にまとめる必要がなかったりするなら、pを分割してみたり、そもそもarr_1とarr_2をくっつけないで処理する方法を検討してみてはいかがでしょうか。

この配列をどのように使用するのかが分かればもう少し建設的な意見が言えるかもですので、もし解決しないようであれば、ご検討ください。

投稿2020/04/02 14:26

Matsui_hero

総合スコア346

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問