2015-10-26 30 views
23

簡単な質問:これらの各方法の利点は何ですか?適切なパラメータ(とndarrayの形状)が与えられているように見えるのは、すべて同じように見えます。いくつかの場所で動作しますか?より良いパフォーマンスを備えていますか?どの関数を使うべきですか?hstack/vstack vs append vs concatenate vs column_stack

答えて

11

あなたはこれらの機能のコードにアクセスできますか?すべては、np.concatenateを除き、Pythonで書かれています。 IPythonシェルの場合は、??を使用します。

ない場合は、ここではそのコードのまとめです:つまり

vstack 
concatenate([atleast_2d(_m) for _m in tup], 0) 
i.e. turn all imputs in to 2d (or more) and concatenate on first 

hstack 
concatenate([atleast_1d(_m) for _m in tup], axis=<0 or 1>) 

colstack 
transform arrays with (if needed) 
    array(arr, copy=False, subok=True, ndmin=2).T 

append 
concatenate((asarray(arr), values), axis=axis) 

、これらすべての作業の入力配列の大きさを微調整した後、右軸に連結することによって。それらは単なる便利な関数です。

+0

"これらの機能のコードにアクセスできますか?" - numpyは[オープンソース](https://github.com/numpy/numpy)です。 – Annan

3

IPythonでは、関数のソースコードの後に​​、その名前の後に??と入力すると、関数のソースコードを見ることができます。 hstackを見てみると、私たちはそれが実際に(同様にvstackcolumn_stack付き)concatenate単なるラッパーだと見ることができます。

np.hstack?? 
def hstack(tup): 
... 
    arrs = [atleast_1d(_m) for _m in tup] 
    # As a special case, dimension 0 of 1-dimensional arrays is "horizontal" 
    if arrs[0].ndim == 1: 
     return _nx.concatenate(arrs, 0) 
    else: 
     return _nx.concatenate(arrs, 1) 

だから私はちょうどあなたに最も論理的な響きの名前を持っている方のいずれかを使用と思います。

2

numpy.vstack:垂直に配列スタックアレイ(行ごとの).Equivalent np.concatenate(tup, axis=0)例に参照:https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

numpy.hstack:配列スタックアレイ水平(列方向).Equivalent np.concatenate(tup, axis=1)に。例: https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html

appendは、Pythonの組み込みデータ構造listの関数です。リストに要素を追加するたびに。明らかに、複数の要素を追加するには、extendを使用します。簡単に言えば、numpyの機能ははるかに強力です。

例:

ものと想定gray.shape =(N0、N1)

np.vstack((gray,gray,gray))は(N0 * 3、N1)形状を持つことになり、あなたもnp.concantenate((gray,gray,gray),axis=0)

np.hstack((gray,gray,gray))でそれを行うことができますがあります形状(n0、n1 * 3)の場合は、np.concantenate((gray,gray,gray),axis=1)

np.dstack((gray,gray,gray))の形状(n0、n1,3)になります。