質問するログイン新規登録
Python

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

Q&A

解決済

1回答

4589閲覧

numpyの配列の連結

Obayashi

総合スコア77

Python

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

1グッド

0クリップ

投稿2017/08/13 09:44

1

0

numpyで配列を連結する際、複数の方法があるようですが、使い分けがわかりません。
試しに以下のコードを実行してみたところ、同じ結果が返ってきたように見えます。
これらに違いは無いのでしょうか?
メリットデメリットや、一般的によく使われているものなどあればご教授頂けたら幸いです。

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[10,20,30],[40,50,60],[70,80,90]])

<行方向の連結>
np.r_[a,b]
np.vstack((a,b))
np.concatenate((a,b), axis=0)
------------ 結果 --------------
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])

<列方向の連結>
np.c_[a, b]
np.hstack((a,b))
np.concatenate((a,b), axis=1)
------------ 結果 --------------
array([[ 1, 2, 3, 10, 20, 30],
[ 4, 5, 6, 40, 50, 60],
[ 7, 8, 9, 70, 80, 90]])

watarusugimoto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

結果は同じです。
しかし実行時間やメモリ使用量は異なるかもしれませんのでjupyter notebook上で実行時間を計測してみました。

Python

1import numpy as np 2 3a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 4b = np.array([[10,20,30],[40,50,60],[70,80,90]]) 5 6print('np.r_') 7%timeit np.r_[a,b] 8 9print('np.vstack') 10%timeit np.vstack((a,b)) 11 12print('np.concatenate(axis=0)') 13%timeit np.concatenate((a,b), axis=0) 14 15print('np.c_') 16%timeit np.c_[a, b] 17 18print('np.hstack') 19%timeit np.hstack((a,b)) 20 21print('np.concatenate(axis=1)') 22%timeit np.concatenate((a,b), axis=1)

結果

np.r_ The slowest run took 5.50 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 10.7 µs per loop np.vstack The slowest run took 4.12 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 3.58 µs per loop np.concatenate(axis=0) The slowest run took 8.48 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 1.17 µs per loop np.c_ 100000 loops, best of 3: 12.2 µs per loop np.hstack The slowest run took 4.02 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 3.44 µs per loop np.concatenate(axis=1) The slowest run took 7.45 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 1.17 µs per loop

上記によると、再遅と比較しての速度のばらつきは気になりますがconcatenateが最速のようです.

また、下記に似た話題がありました。
python why use numpy.r_ instead of concatenate
np.r_(np.c_も?)はpure pythonで実装されている(最適化されていない)ので、他より速くなることはないようです。

以上より、特にこだわりがなければconcatenateを使うのがよいと思います。

投稿2017/08/13 10:42

can110

総合スコア38352

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問