1. ホーム
  2. python

[解決済み] hstack/vstack と append と concatenate と column_stack はどのように使い分ければよいですか?

2022-12-05 18:27:30

質問

単純な質問ですが、これらのメソッドのそれぞれの利点は何でしょうか。正しいパラメータ(およびndarrayの形状)が与えられると、それらはすべて一見等価に動作するように見えます。いくつかのメソッドは同じ場所で動作しますか? より良いパフォーマンスを持っていますか?どの関数をいつ使うべきですか?

どのように解決するのですか?

全ての関数はPythonで書かれています。 np.concatenate . IPython シェルでは、単に ?? .

そうでない場合は、そのコードの要約を紹介します。

vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all inputs 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)

つまり、これらはすべて入力配列の次元を調整し、右軸に連結することで動作します。 便利な関数に過ぎません。


そして、より新しい np.stack :

arrays = [asanyarray(arr) for arr in arrays]
shapes = set(arr.shape for arr in arrays)
result_ndim = arrays[0].ndim + 1
axis = normalize_axis_index(axis, result_ndim)
sl = (slice(None),) * axis + (_nx.newaxis,)

expanded_arrays = [arr[sl] for arr in arrays]
concatenate(expanded_arrays, axis=axis, out=out)

つまり、すべての入力のdimを展開します(少し似ていますが np.expand_dims のようなものです)、そして連結します。 このとき axis=0 と同じになります。 np.array .

hstack のドキュメントが追加されました。

関数 concatenate , stackblock は、より一般的な積み重ねと連結の操作を提供します。

np.block も新しいものです。 これは事実上、ネストされたリストに沿って再帰的に連結します。