numpy.vstack() と numpy.r_ が対応していて、numpy.hstack() と numpy.c_ が対応しているという捉え方をするのではなく、これらの関数はすべて異なる挙動を持つが、
- 2次元配列同士を結合したら、結果として、numpy.vstack() と numpy.r_、numpy.hstack() と numpy.c_ が同じになった
- 1次元配列同士を結合したら、結果として、numpy.hstack() と numpy.r_ が同じになった
と考えてください。挙動については詳しくはドキュメントを参照ください。
numpy.hstack
- すべて1次元配列の場合は、
axis=0
方向に結合
- そうでない場合、
axis=1
方向で結合
なので、2つの1次元配列を渡した場合、1つの1次元配列に結合した結果になります。
python
1a = np.array([1, 2, 3])
2b = np.array([4, 5, 6, 7, 8])
3print(np.hstack((a, b)))
4# [1 2 3 4 5 6 7 8]
numpy.r_
- 指定した配列を axis=0 方向に結合 (デフォルト)
なので、numpy.hstack() と同じく axis=0 方向での結果なので同じ結果になります。
python
1a = np.array([1, 2, 3])
2b = np.array([4, 5, 6, 7, 8])
3print(np.r_[a, b])
4# [1 2 3 4 5 6 7 8]
とくに numpy.r_ は最初のカンマ前に文字列で結合する axis を指定する機能があるので、他の hstack()、vstack()、c_ の3つのどれにもなれます。
python
1a = np.array([[1, 2],
2 [3, 4]])
3b = np.array([[5, 6],
4 [8, 9]])
5
6# axis=1 方向で結合する。
7c = np.r_['1', a, b]
8print(c)
9# [[1 2 5 6]
10# [3 4 8 9]]
追記
挙動の違いとしては、
- どの方向で結合するか
- 渡した配列の次元数が規定未満の場合は、結合前に次元を拡張するものがある
→ 例えば、numpy.vstack() に1次元配列を渡すと [1, 2, 3] →[[1, 2, 3]] のように形状を変更してから結合します。
python
1arrays = ([1, 2, 3], [4, 5, 6])
2print(np.r_[arrays])
3# [1 2 3 4 5 6]
4print(np.hstack(arrays))
5# [[1 4]
6# [2 5]
7# [3 6]]
8print(np.c_[arrays])
9# [[1 2 3]
10# [4 5 6]]
11print(np.vstack(arrays))
12# [[1 2]
13# [3 4]
14# [5 6]
15# [7 8]]
16
17arrays = (
18 [[1, 2], [3, 4]],
19 [[5, 6], [7, 8]],
20)
21
22print(np.r_[arrays])
23# [[1 2]
24# [3 4]
25# [5 6]
26# [7 8]]
27print(np.hstack(arrays))
28# [[1 2 5 6]
29# [3 4 7 8]]
30print(np.c_[arrays])
31# [[1 2 5 6]
32# [3 4 7 8]]
33print(np.vstack(arrays))
34# [[1 2]
35# [3 4]
36# [5 6]
37# [7 8]]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/12 06:33
2020/06/12 06:36
2020/06/12 06:45