2016-09-20 12 views
3

これはかなり基本的な質問のようですが、スタックに関連するものは何も見つかりませんでした。私が既存の質問を逃した場合にはお詫び申し上げます。numpyでndim 1または2ベクトルを使用するパフォーマンス上の理由はありますか?

行/列ベクトル(ndim 2)とは対照的に、numpyベクトルを「適切」(つまりndim 1)にしたいと思ういくつかの数学的/線形代数的理由があります。

しかし、今私は疑問に思っています。効率があります。その点で選択肢はかなり自由ですか?

明らかにする(編集)による "ndim 1 ndim対2つのベクトル" 私はどちらかと言う、含むベクター、数字3と4を表す意味:

  • np.array([3、 4])#ndim 1

  • np.array([[3,4]])#1 ndim 2

numpyのドキュメントは、デフォルトとして最初のケースに向かって傾くように見えるが、私のような言った、私は何かがある場合はのパフォーマンスの違い。

+0

MATLABまたはGNU Octaveとは対照的に、2次元行列と1次元ベクトルを連結して連結するときに、時には混乱します。 1-Dベクトルを2-D行列に変換するのでなければ失敗しますが、MATLABでは問題ありません。 (MATLABでは、すべてのベクトルは1xNまたはNx1サイズの2次元行列です) – Jeon

答えて

2

numpyを正しく使用すると、いいえ、それは考慮されません。

あなたはnumpy internals documentationを見れば、あなたは

numpyのアレイは2つの主要コンポーネントで、生の配列データ(今から、データバッファと呼ばれる)、およびに関する情報で構成されていることがわかります生の配列データデータバッファーは、一般的に、固定サイズのデータ​​項目を含む連続した(そして固定された)メモリーブロックであるCまたはFortranの配列と考えられています。 Numpyには、データバッファ内のデータをどのように解釈するかを記述する重要なデータセットも含まれています。

したがって、配列の次元に関係なく、すべてのデータは連続バッファに格納されます。今ではa[1]にアクセスする(フラットインデックスへ1, 1の翻訳は、いくつかの計算を必要とする)b[1, 1]よりも(わずかに)より少ない操作を必要としますが、高いためというのは本当です

a = np.array([1, 2, 3, 4]) 

b = np.array([[1, 2], [3, 4]]) 

を考えますとにかく、vectorized operationsが必要です。

配列内のすべての要素を合計する場合は、同じ場合を使用します(a.sum()およびb.sum())。合計はとにかく連続したメモリの要素を超えることになります。逆に、データが本質的に2dの場合は、b.sum(axis=1)のような行を合計することができます。これを1次元アレイで行うと、エラーが発生しやすくなり、効率的ではありません。

したがって、基本的に2次元配列は、問題が自然であれば、ゼロまたは無視できるオーバーヘッドで、より大きな機能性を提供します。

+0

ありがとう、素晴らしい答え。あなたの最後の行を理解しているか分からない: "だから、あなたは基本的により大きな機能を持っている"。 「より大きな機能性」は、2d以上の1d(またはその逆)を指すのではなく、どちらかの表現を選択するためのオプションです。それは私がそれを理解した方法です、私はそれを正しく得ましたか? –

+0

@BertZangleコメントをいただきありがとうございます。更新しました。必要に応じて、さらにコメントしてください。 –

+0

ちょうど簡単なタイミングテストを自分で実行しました(大規模な行列やdim 1/dim 2ベクトルのnp.dot)。網羅的なテストではありませんが、確かにあなたが上に書いたことを自分自身に納得させる方法です。回答としてマークしてください。再度、感謝します! –

関連する問題